我有一个c winform应用程序,它将安装在windows 7、vista和xp机器上,32位或64位,操作系统有英语、德语和西班牙语(以及将来的其他语言)。
我需要得到本地计算机上所有管理员和用户帐户名的列表。我只需要一个帐户名列表,没别的了。
问题是我的代码只适用于英语操作系统。
无论操作系统的语言是什么,无论是xp、vista还是7,无论是32位还是64位,是否有办法在本地计算机上获取用户名?
我在某个地方读到一篇关于使用sid获取本地管理名以防被重命名的文章。使用sid有助于解决我的问题吗?
下面是我的代码。在德语操作系统计算机上,代码在“directoryentry admgroup=localmachine.children.find(“administrators”,“group”);”行失败。它在这里很可能失败,因为在德语操作系统中,“administrators”、“group”可能拼写不同。西班牙语操作系统也可能如此。
我的32位操作系统代码:

DirectoryEntry localMachine = new DirectoryEntry(
    "WinNT://" + Environment.MachineName);

DirectoryEntry admGroup = localMachine.Children.
    Find("administrators", "group");
object adminmembers = admGroup.Invoke("members", null);

DirectoryEntry userGroup = localMachine.Children.Find("users", "group");
object usermembers = userGroup.Invoke("members", null);

//Retrieve each user name.
foreach (object groupMember in (IEnumerable)adminmembers)
{
    DirectoryEntry member = new DirectoryEntry(groupMember);
    if (!(member.Name == "admin" || member.Name == "Domain Admins"))
    {
          drow = dtWindowsUser.NewRow();
          drow["WindowsUser"] = member.Name;

          //Add row to datatable
          dtWindowsUser.Rows.Add(drow);
    }
}
foreach (object groupMember in (IEnumerable)usermembers)
{
    DirectoryEntry member = new DirectoryEntry(groupMember);
    if (!(member.Name == "ACTUser" || member.Name == "ASPNET" ||
          member.Name == "Domain Users" ||
          member.Name == "Authenticated Users" ||
          member.Name == "INTERACTIVE" ||
          member.Name == "SQLDebugger"))
    {
        drow = dtWindowsUser.NewRow();
        drow["WindowsUser"] = member.Name;

        //Add row to datatable
        dtWindowsUser.Rows.Add(drow);
    }
}

我的64位操作系统代码:
SelectQuery query = new SelectQuery("Win32_UserAccount");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject envVar in searcher.Get())
{
    str_name = envVar["Name"].ToString();

    if (!(str_name == "admin" || str_name == "Domain Admins"))
    {
        if (!(str_name == "ACTUser" ||
              str_name == "ASPNET" ||
              str_name == "Domain Users" ||
              str_name == "Authenticated Users" ||
              str_name == "INTERACTIVE" ||
              str_name == "SQLDebugger"))
        {
            if (!(str_name == "HomeGroupUser$"))
            {
                drow = dtWindowsUser.NewRow();
                drow["WindowsUser"] = str_name;

                //Add row to datatable
                dtWindowsUser.Rows.Add(drow);
            }
        }
    }
}

最佳答案

即使在使用英语的系统上,您也不希望按名称检索组-它们可以根据您的期望重命名。对于像administrators这样的内置组,您希望使用well known SID,无论使用什么语言命名组,它都可以工作。
这是一种检索所需数据的方法…

SecurityIdentifier builtinAdminSid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);

PrincipalContext ctx = new PrincipalContext(ContextType.Machine);

GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, builtinAdminsSid.Value);

foreach (Principal p in group.Members)
{
    Console.WriteLine(p.Name);
}

编辑:@jyoung建议使用wellknownsidtype比使用硬编码的魔法值(如String builtinAdminsSidString = "S-1-5-32-544";)要好得多,所以我更改了上面的示例代码。

关于c# - 如何获取XP,Vist&7、32位或64位以及任何操作系统语言的所有用户帐户名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6318611/

10-17 00:01