16

问题:

我使用在 http://support.microsoft.com/kb/306273找到的代码

添加 Windows 用户。问题是我需要将用户添加到组中,但组名已本地化。

例如,MS 示例使用英文计算机,这意味着您可以像这样获取来宾组:

grp = AD.Children.Find("Guests", "group")

但是在非英语计算机上,“Guest”组名是本地化的,例如在我的德语操作系统上,Guest 的组名是“Gäste”。

这意味着要在我的计算机上运行支持示例,我需要将该行更改为

grp = AD.Children.Find("Gäste", "group")

然后它工作。

现在,如果操作系统是任何其他语言,我如何找到来宾用户的名称?或者我如何从 sid 获取来宾用户名?

注意:.NET 2.0,而不是 3.0 或 3.5

4

6 回答 6

12

正如您所指出的,组的名称根据系统语言进行了本地化。

对于像“Administrators”和“Guests”这样的“知名”组,您应该根据 SID 进行检索。客人的 SID 是:

S-1-5-32-546

这里有一个众所周知的 SID 列表:

http://support.microsoft.com/kb/243330

从 SID 获取组名的代码可以在这里找到

于 2010-07-09T13:23:03.600 回答
9

您可以使用此代码,对于非英文系统,返回值是正确的:

var guestsGroup = new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null).Translate(typeof(NTAccount)).Value;
于 2013-04-11T17:29:27.810 回答
3

通过 SID 查找帐户是最好的方法。这有点做作,但它的工作方式是这样的:

  • 管理员帐户的 SID始终.开头S-1-5-21和结尾-500。中间的其他一切都是随机的(域的 SID)。

  • 来宾帐户的SID始终以 开头S-1-5-21和结尾-501

描述此内容的 Microsoft 知识库文章可在此处获得。

要查找这些帐户,您必须枚举本地计算机上的所有帐户,并找出以这些数字开头和结尾的 SID。一旦它们匹配,您就拥有了内置帐户。不是最好的方法,但它有效。

在Security Settings\Local Policies\Security Options下还有一个名为Accounts: Rename administrator accountAccounts: Rename guest account的组策略设置。我无法找到这些设置在注册表中的存储位置,但如果您能够找到并查找它们,您很可能能够获得这两个帐户的“官方”名称。

于 2010-07-09T13:22:30.077 回答
1

这个页面有一些用于获取用户详细信息并检查它们的代码。

这段代码:

public IdentityReferenceCollection GetUserGroups()
{
    System.Security.Principal.WindowsIdentity currentUser =
                      System.Security.Principal.WindowsIdentity.GetCurrent();
    return currentUser.Groups;
}

返回当前用户的组。

更多关于整个WindowsIdentity类的详细信息可以在这里找到,Groups属性在这里

于 2010-07-09T13:27:45.927 回答
0

您应该能够使用 WindowsIdentity 和 WindowsPrincipal 类:

Dim currentIdentity as WindowsIdentity = WindowsIdentity.GetCurrent()
Dim currentPrincipal as WindowsPrincipal = New WindowsPrincipal(currentIdentity)

If currentPrincipal.IsInRole(WindowsBuiltInRole.Guest) Then
   Foobar()
End If

没关系,我看到您实际上是在尝试将用户添加到组中。

于 2010-07-09T13:28:15.140 回答
0

如果您想获得管理员组,可以使用以下代码:

public static DirectoryEntry GetLocalAdminstratorGroup()
{
  using (var WindowsActiveDirectory = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"))
    {
      return WindowsActiveDirectory.Children.Find(GetLocalizedAdministratorGroupName(), "group");
    }
}

 //Localized == Language Independent
public static string GetLocalizedAdministratorGroupName()
{
 //For English Windows version, this equals "BUILTIN\Administrators".
 var adminGroupName = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null).Translate(typeof(NTAccount)).Value;

 //Remove the "BUILTIN\" part, get the local name of the group
 return adminGroupName.Split('\\')[1];
}

如果你还想枚举它(比如你需要一个用户名),你可以这样做,使用之前的方法:

DirectoryEntry AdminGroup = GetLocalAdminstratorGroup();

object members = AdminGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
  DirectoryEntry member = new DirectoryEntry(groupMember);
  Console.WriteLine(member.Name);
}
于 2021-11-26T07:45:02.947 回答