我正在使用 DirectoryServices 和 WinNT:// 提供程序连接到远程计算机。然后我检查一些组成员信息,并可能在指定的本地组中添加或删除域用户。
我已经能够使用 vb.net 控制台应用程序以及与我的本地盒子或我登录的帐户具有管理权限的任何盒子进行通信时,让所有这些代码顺利运行。
代码:
string strUserPath = "WinNT://DomainName/someuser,user";
DirectoryEntry deComputer = new DirectoryEntry("WinNT://" + Computername + ",computer");
deComputer.RefreshCache();
DirectoryEntry deGroup = deComputer.Children.Find("administrators", "group");
IEnumerable members = deGroup.Invoke("members", null);
List<DirectoryEntry> r = new List<DirectoryEntry>();
foreach (object o in members)
{
DirectoryEntry deMember = new DirectoryEntry(o);
r.Add(deMember);
}
deGroup.Invoke("Add", strUserPath);
deGroup.CommitChanges();
deGroup.Invoke("Remove", strUserPath);
deGroup.CommitChanges();
因此,我将代码移至 ASP.Net Web 应用程序,该应用程序通过 web.config 的 Impersonate 部分模拟服务帐户。我模拟的帐户在任何工作站上都没有管理员权限,因此我将用户名/密码输入到计算机条目的构造函数中,如下所示:
DirectoryEntry deComputer = new DirectoryEntry("WinNT://" + Computername + ",computer", username, password);
用户名是在每个工作站上都具有本地管理员权限的域帐户的用户名。如果我查看生成的 deComputer 对象的 Username 属性,我可以看到用户名与我输入的匹配。此外,如果我输入了无效的密码,它会引发错误,因此它会以某种方式进行身份验证。
但是,如果我现在尝试从远程工作站添加或删除用户,则会收到一般访问被拒绝错误。如果我在该工作站上添加 ASP.Net 用作本地管理员的服务帐户,它将添加和删除没有问题。
因此,接下来我尝试使用 LogonAPI(advapi32.dll ->LogonUser 调用)以作为所有工作站上的本地管理员的用户帐户登录,模拟生成的 WindowsIdentitiy 并尝试仅运行原始的 deComputer 实例。当我这样做时,每个属性,excepty Path,都会返回一个 OLE 异常......
我对下一步要尝试什么感到很迷茫。任何帮助将不胜感激。
--解决方法--
为了解决这个问题,我们创建了一个在本地管理员帐户下运行的 Windows 服务,因此运行代码没有任何问题。我们将所有更新推送到 SQL 数据库中的表中,服务会提取并处理它们。但是,我仍然很想知道为什么这不起作用,并且直接从网站推送更新会很好。