如何在XP中获取所有用户帐户名称,Vist&;7,适用于32或64位,以及任何操作系统语言

本文关键字:适用于 amp 64位 操作系统 语言 任何 Vist 获取 XP 用户 | 更新日期: 2023-09-27 17:59:07

我有一个C#winform应用程序,它将安装在Windows 7、Vista和XP机器上,无论是32位还是64位,操作系统为英语、德语和西班牙语(以及未来的其他语言)。

我需要获得本地机器上所有管理员和用户帐户名称的列表。我只需要一个帐户名称的列表,仅此而已。

问题是我的代码只适用于英语操作系统。

有没有一种方法可以在本地机器上获取用户名,无论操作系统的语言如何,无论是XP、Vista还是7,无论是32位还是64位?

我在某个地方读到一篇关于使用SID获取本地管理员名称的帖子,以防它被重命名。使用SID可以帮助解决我的问题吗?

下面是我的代码。在德语操作系统计算机上,代码在"DirectoryEntry admGroup=localMachine.Children.Find("administrators","group");"行失败。它在这里失败的可能性很大,因为在德语操作系统中,"administrators"answers"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);
            }
        }
    }
}

如何在XP中获取所有用户帐户名称,Vist&;7,适用于32或64位,以及任何操作系统语言

即使在使用英语的系统上,您也不希望按名称检索组——它们可以根据您的期望进行重命名。对于像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";这样的硬编码魔术值要好得多,所以我更改了上面的示例代码。

这个关于如何获取Builtin Administrators名称的示例可能会有所帮助。

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获取语言,然后使用switch case(您自己必须搜索文件夹名称)。