如何获得XP,Vist&7、32位或64位以及任何OS语言中的所有用户帐户名

问题描述

| 我有一个C#winform应用程序,它将安装在32位或64位的Windows 7,Vista和XP计算机上,并具有英语,德语和西班牙语(以及将来的其他语言)的操作系统。 我需要获取本地计算机上所有管理员和用户帐户名称的列表。我只需要一个帐户名列表,仅此而已。 问题是我的代码仅适用于英语操作系统。 有没有一种方法可以获取本地计算机上的用户名,而与操作系统的语言无关,而无论它是XP,Vista还是7,还是32位还是64位? 我曾在某处读过一篇有关使用SID获取本地管理员名称的帖子,以防它已被重命名。使用SID可以帮助解决我的问题吗? 下面是我的代码。在德语OS计算机上,代码在行\“ DirectoryEntry admGroup = localMachine.Children.Find(\” 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这样的内置组,您希望使用一个众所周知的SID,无论使用哪种语言来命名该组,该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\";
这样的硬编码魔术值要好得多,所以我更改了上面的示例代码。     ,        这个如何获取内置管理员名称的示例可能会有所帮助。
var builtinAdministratorsName = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid,null).
    Translate(typeof(NTAccount)).Value;
    ,        请尝试以下方法:
using System.Management;

using (var accountSearcher = new System.Management.ManagementObjectSearcher(\"SELECT * FROM Win32_UserAccount WHERE LocalAccount=True\"))
    using (var accountCollection = accountSearcher.Get())
        foreach (var account in accountCollection)
            this.listBox1.Items.Add(account[\"Name\"].ToString());
    ,        使用GetSystemUILanguage获取语言,然后使用切换大小写(您必须自己搜索文件夹名称)。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...