Создание папок Windows с использованием олицетворения - PullRequest
3 голосов
/ 18 января 2012

Я пытаюсь создать папку, используя учетные данные ограниченной учетной записи администратора, предоставленной зашифрованным файлом .config - сейчас мой код выполняется в предположении, что у пользователя нет доступа к этим каталогам, поэтому выбрасывается несанкционированное исключение , когда предоставлен доступ, код работает иначе, но я не могу этого сделать, так как это поставит под угрозу нашу безопасность. Я уже знаю, как вытащить свое имя пользователя / пароль из зашифрованного файла, я просто не уверен, какую библиотеку или синтаксис я должен использовать для олицетворения; это мой код:

//set the cursor

string activeDir = "\\\\department\\shares\\users\\";

//create directory with userID as the folder name

string newPath = System.IO.Path.Combine(activeDir + userID);

System.IO.Directory.CreateDirectory(newPath);

поэтому мне нужен способ предоставления учетных данных, но я в растерянности - я использую System.DirectoryServices.AccountManagement и pricipalcontext для предоставления имени пользователя / пароля для внесения изменений в активный каталог ... Нужно использовать подобную библиотеку для внесения изменений в файловую систему? любая помощь будет оценена, спасибо!

Ответы [ 2 ]

6 голосов
/ 18 января 2012

Я думаю, что вы можете временно выдать себя за этого пользователя за поток, выполняющий это действие. Кажется, что это можно сделать только с помощью P / Invoke. Посмотрите на этот пример .

using (var impersonation = new ImpersonatedUser(decryptedUser, decryptedDomain, decryptedPassword))
{
  Directory.CreateDirectory(newPath);
}

Ради полноты (если ссылка однажды перестает работать), найдите класс ImpersonatedUser ниже (кредиты Jon Cole ):

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;

public class ImpersonatedUser : IDisposable
{
    IntPtr userHandle;

    WindowsImpersonationContext impersonationContext;

    public ImpersonatedUser(string user, string domain, string password)
    {
        userHandle = IntPtr.Zero;

        bool loggedOn = LogonUser(
            user,
            domain,
            password,
            LogonType.Interactive,
            LogonProvider.Default,
            out userHandle); 

        if (!loggedOn)
            throw new Win32Exception(Marshal.GetLastWin32Error());

        // Begin impersonating the user
        impersonationContext = WindowsIdentity.Impersonate(userHandle);
    } 

    public void Dispose()
    {
        if (userHandle != IntPtr.Zero)
        {
            CloseHandle(userHandle);

            userHandle = IntPtr.Zero;

            impersonationContext.Undo();
        }
    } 

    [DllImport("advapi32.dll", SetLastError = true)]
    static extern bool LogonUser(

        string lpszUsername,

        string lpszDomain,

        string lpszPassword,

        LogonType dwLogonType,

        LogonProvider dwLogonProvider,

        out IntPtr phToken

        );

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool CloseHandle(IntPtr hHandle);

    enum LogonType : int
    {
        Interactive = 2,
        Network = 3,
        Batch = 4,
        Service = 5,
        NetworkCleartext = 8,
        NewCredentials = 9,
    }

    enum LogonProvider : int
    {
        Default = 0,
    }

}
0 голосов
/ 18 января 2012

Использование сетевых функций Windows (WNet). Они были поддержаны Windows 2000 и более поздними версиями. Упаковочный:

public class WNet
{
    public static void AddConnection(string resource, string username, string password)
    {
        NETRESOURCE nr = new NETRESOURCE();
        nr.RemoteName = resource;
        uint err = WNetAddConnection2W(ref nr, password, username, 0);
        if (err != 0)
            throw new RemoteDirectoryException(string.Format("WNetAddConnection2 failed with error: #{0}", err));
    }

    private struct NETRESOURCE
    {
        public uint Scope;
        public uint Type;
        public uint DisplayType;
        public uint Usage;
        public string LocalName;
        public string RemoteName;
        public string Comment;
        public string Provider;
    }

    [DllImport("mpr.dll", CharSet = CharSet.Unicode)]
    private extern static uint WNetAddConnection2W(ref NETRESOURCE lpNetResource, string lpPassword, string lpUsername, uint dwFlags);
}

Добавление соединения с ресурсом и создание каталога:

string activeDir = "\\\\department\\shares\\users\\";
string username = "username";
string password = "password";

WNet.AddConnection(activeDir, username, password);

string newPath = System.IO.Path.Combine(activeDir, userID);
System.IO.Directory.CreateDirectory(newPath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...