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 服务器的*版本*?