在本地计算机上启用或禁用用户

3
为了在本地计算机上启用或禁用用户,我正在使用以下代码片段。
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
DirectoryEntry currentUser = localMachine.Children.Find(user, "Administrators");
currentUser.Invoke("AccountDisabled", new object[] { true });
currentUser.CommitChanges();

我把用户分配为一个字符串,但是出现了“文件路径未找到错误”:Comexception Unhandled。

我的代码有什么问题吗?


我认为错误是正确的:路径未找到。可能是由WinNT://引起的。我不知道你想要实现什么。 - Gerrie Schenck
这是指定 Windows 域系统,我将在其中查找用户。 - user1528803
你认为我的代码应该在没有 WinNT:// 的情况下工作吗? - user1528803
这是一个协议还是路径名?如果使用 XX://(注意斜杠),Windows 将会将其理解为协议。如果使用 xx\,则会被理解为路径名。此外:我建议使用 Path.Combine() 进行连接。 - Jack
你的代码片段不完整。你正在使用一个变量user,请帮助提供完整的信息。 - Security Hound
4个回答

5
如果您使用的是.NET 3.5及以上版本,则应该查看System.DirectoryServices.AccountManagement (S.DS.AM)命名空间。在此处阅读有关它的所有信息: 基本上,您可以定义一个机器级上下文,并轻松地在AD中查找用户和/或组:
// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Machine);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{
   user.Enabled = false;
   user.Save();
}

新的S.DS.AM使得在AD中玩弄用户和组变得非常容易!

2
根据 MSDN 页面 上的 DirectoryEntry 说明:

连接到计算机上的用户。例如,"WinNT://<domain name>/<computer name>/<user name>"。如果您要连接到本地计算机,则为 "WinNT://<computer name>/<user name>"

因此,您获取用户的代码应该是:
DirectoryEntry currentUser = new DirectoryEntry("WinNT://" + Environment.MachineName + "/" + user);

1

use like this

        DirectoryEntry local = new DirectoryEntry("WinNT://localhost");
        DirectoryEntry user = local.Children.Find(username);
        user.InvokeSet("AccountDisabled", true);
        user.CommitChanges();

0
尝试使用统一命名约定,即像这样使用"\\\\":
DirectoryEntry localMachine = new DirectoryEntry("WinNT:\\" + Environment.MachineName);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接