C # Файловая система на удаленном сервере в ActiveDirectory и олицетворении - PullRequest
0 голосов
/ 26 января 2012

Эта тема не нова. Но мне нужна помощь какого-то профессионала. Я делаю приложение Windows Form, которое будет работать в локальной системе (не на компьютере домена). Приложение будет создавать папку и некоторые файлы в общей папке домена Active Directory. Я читал об олицетворении и пытался сделать что-то вроде этого: Олицетворение с помощью LogonUser

Тогда я написал следующий код:

using System.Security.Principal;
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
    private enum LogonSessionType : uint
    {
        Interactive = 2,
        Network,
        Batch,
        Service,
        NetworkCleartext = 8,
        NewCredentials
    }

    private enum LogonProvider : uint
    {
        Default = 0,
        WinNT35,
        WinNT40,
        WinNT50
    }
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool CloseHandle(IntPtr handle);
    [DllImport("advapi32.dll", SetLastError = true)]
    static extern bool LogonUser(
        string principal,
        string authority,
        string password,
        LogonSessionType logonType,
        LogonProvider logonProvider,
        out IntPtr token);

    public Form1()
    {
        InitializeComponent();
    }

    protected void btnConnect_Click(object sender, EventArgs e)
    {
        IntPtr token = IntPtr.Zero;
        WindowsImpersonationContext impersonateUser = null;
        try
        {
            bool result = LogonUser("Administrator@mydomain.ru", "192.168.1.1", "SomeP@ssWorD",
                                    LogonSessionType.Network, LogonProvider.Default, out token);
            if(result)
            {
                WindowsIdentity id = new WindowsIdentity(token);
                impersonateUser = id.Impersonate();
                string showtext = string.Format("Identity: {0}", WindowsIdentity.GetCurrent().Name);
                MessageBox.Show(showtext);
            }
            else
            {
                string showtext = string.Format("Identity: {0}", "Fail");
                MessageBox.Show(showtext);
            }
        }
        catch
        {
        }
        finally
        {
            if(impersonateUser!=null)
                impersonateUser.Undo();
            if (token != IntPtr.Zero)
                CloseHandle(token);
        }
    }
}

Но bool result всегда = false . Что я делаю не так?

1 Ответ

0 голосов
/ 19 марта 2012

Я был не прав относительно понимания функции LogonUser. Я думал, что эта функция получит удаленный токен, но он сгенерирует. Вот правильное использование:

bool result = LogonUser("Administrator", "mydomain.ru", "SomePa$$worD", LogonSessionType.NewCredentials, LogonProvider.Default, out safeTokenHandle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...