среда, 1 июля 2015 г.

C# доступ к сетвой папке по имени пользователя и паролю

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace LogonUser
{
    class Class1
    {
        private const int LOGON32_LOGON_INTERACTIVE = 2;
        private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 3;
        private const int LOGON32_PROVIDER_DEFAULT = 0;
        [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
        static extern int LogonUser(string lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
        [STAThread]
        static void Main(string[] args)
        {
            string UserName = "логин к папке";
            string Password = "пароль как папке";
            // Для сохранения текущей имперсонации
            WindowsImpersonationContext impersonationContext = null;
            try
            {
                // Имперсонируем другого пользователя
                WindowsIdentity newIdentity;
                IntPtr token = IntPtr.Zero;
                IntPtr tokenDuplicate = IntPtr.Zero;
                if (LogonUser(UserName, Environment.MachineName, Password,
                    LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_DEFAULT, ref token!= 0)
                {
                    if (DuplicateToken(token, 2, ref tokenDuplicate!= 0)
                    {
                        newIdentity = new WindowsIdentity(tokenDuplicate);
                        // При имперсонации возвращается текущее значение
                        impersonationContext = newIdentity.Impersonate();
                    }
                }
            }
            catch (Exception Ex)
            {
                Console.WriteLine("Ошибка имперсонации пользователя {0}: {1}", UserName, Ex);
            }
            // Новая имперсонация
            WindowsIdentity wi1 = WindowsIdentity.GetCurrent();
            Console.WriteLine("Name={0} --> {1}", wi1.Name, wi1.IsAuthenticated);
            // Действие
            string[] files = Directory.GetFiles(@"\\10.0.0.71\install\");
            Console.WriteLine("--- Files: ---");
            foreach (string name in files)
            {
                Console.WriteLine(name);
            }
            // Возвращаем предыдущую имперсонацию
            if (impersonationContext != null)
                impersonationContext.Undo();
            Console.ReadKey(true);
        }
    }
},

Комментариев нет:

Отправить комментарий

Docker. Первые контейнеры

Источник:  php.dragomano.ru Структура каталогов: ~/develop/web/project/                  nginx/      - сервис web-сервера                php...