ActiveDirectory 和模拟中远程服务器上的 C# 文件系统

Posted

技术标签:

【中文标题】ActiveDirectory 和模拟中远程服务器上的 C# 文件系统【英文标题】:C# File system on remote server in ActiveDirectory and Impersonation 【发布时间】:2012-01-26 08:27:10 【问题描述】:

这个主题并不新鲜。但我需要一些专业人士的帮助。 我正在制作一个将在本地系统(而不是域的计算机)上运行的 Windows 窗体应用程序。该应用程序将在 Active Directory 域的共享文件夹中创建文件夹和一些文件。 我已经阅读了关于 Impersonation 的文章,并试图做出这样的事情:Impersonation by using 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 结果 总是 = false。我做错了什么?

【问题讨论】:

您实际上是在传递值“Administrator@mydomain.ru”,还是它们只是您过去没有输入真实用户名和密码的示例? 在 LogonUser(...) 之后调用 GetLastError() 以查看 Windows 认为是什么问题。 【参考方案1】:

我对 LogonUser 函数的理解有误。我在想这个函数会获取远程令牌,但它会生成。 这是正确的使用:

bool result = LogonUser("Administrator", "mydomain.ru", "SomePa$$worD", LogonSessionType.NewCredentials, LogonProvider.Default, out safeTokenHandle);

【讨论】:

以上是关于ActiveDirectory 和模拟中远程服务器上的 C# 文件系统的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 表单身份验证和 Active Directory 模拟

在 C# 中验证远程 Active Directory 的用户

C# ActiveDirectory - 如何将本地用户帐户从加入域的计算机远程添加到非域计算机

如何使用远程 LDAP 客户端确定 Active Directory 服务器的*版本*?

在开发/测试环境中模拟 Active Directory 登录

如何在 Windows XP 上安装 Windows Server 2003 管理工具包