如何获得在XP中,访问次数和放大器的所有用户帐户名称; 7,对32位或64位,和任何操作系统语言放大器、如何获得、帐户、次数

由网友(你就是个憨憨)分享简介:我会(在未来和其他语言)安装在Windows 7,Vista和XP的机器,无论是32位或64位,有英语,德语和西班牙语操作系统的一个C#WinForm应用程序。我需要在本地计算机上的所有管理和用户帐户名称的列表。我只是需要的帐户名称的列表,仅此而已。问题是我的code仅适用于英文操作系统。 有没有一种方法来获取本地计算...

我会(在未来和其他语言)安装在Windows 7,Vista和XP的机器,无论是32位或64位,有英语,德语和西班牙语操作系统的一个C#WinForm应用程序。

我需要在本地计算机上的所有管理和用户帐户名称的列表。我只是需要的帐户名称的列表,仅此而已。

问题是我的code仅适用于英文操作系统。

有没有一种方法来获取本地计算机上的用户名称,而不考虑操作系统的语言,也不管是XP,Vista或Windows 7,也不管是否是32位还是64位?

我读了某处后有关使用SID取得情况下,它已改名为本地管理员的名称。可以使用SID有助于解决我的问题?

下面是我的code。在德语语言操作系统的计算机中,code未能就行了的DirectoryEntry admGroup = localMachine.Children.Find(管理员,集团);。它没有在这里很可能是因为在德国操作系统中的管理员,群很可能拼写不同。这同样是西班牙语的操作系统可能如此。

我的code的32位操作系统:

 的DirectoryEntry LOCALMACHINE =新的DirectoryEntry(
    WINNT://+ Environment.MachineName);

的DirectoryEntry admGroup = localMachine.Children。
    查找(管理员,集团);
对象adminmembers = admGroup.Invoke(成员​​,NULL);

的DirectoryEntry所在的用户组= localMachine.Children.Find(用户,集团);
对象usermembers = userGroup.Invoke(成员​​,NULL);

//获得每个用户名。
的foreach(在(IEnumerable的)adminmembers对象groupMember)
{
    的DirectoryEntry成员=新的DirectoryEntry(groupMember);
    如果(!(member.Name ==管理员|| member.Name ==域管理员))
    {
          卓尔= dtWindowsUser.NewRow();
          卓尔[WindowsUser] = member.Name;

          //添加行数据表
          dtWindowsUser.Rows.Add(卓尔);
    }
}
的foreach(在(IEnumerable的)usermembers对象groupMember)
{
    的DirectoryEntry成员=新的DirectoryEntry(groupMember);
    如果(!(member.Name ==ACTUser|| member.Name ==ASPNET||
          member.Name ==域用户||
          member.Name ==验证用户||
          member.Name ==互动||
          member.Name ==SQLDebugger))
    {
        卓尔= dtWindowsUser.NewRow();
        卓尔[WindowsUser] = member.Name;

        //添加行数据表
        dtWindowsUser.Rows.Add(卓尔);
    }
}
 

我的code的64位操作系统:

  SelectQuery查询=新SelectQuery(Win32_UserAccount);
ManagementObjectSearcher搜索=新ManagementObjectSearcher(查询);
的foreach(的ManagementObject ENVVAR在searcher.Get())
{
    str_name = ENVVAR [名称]的ToString()。

    如果(!(str_name ==管理员|| str_name ==域管理员))
    {
        如果(!(str_name ==ACTUser||
              str_name ==ASPNET||
              str_name ==域用户||
              str_name ==验证用户||
              str_name ==互动||
              str_name ==SQLDebugger))
        {
            如果(!(str_name ==HomeGroupUser $))
            {
                卓尔= dtWindowsUser.NewRow();
                卓尔[WindowsUser] = str_name;

                //添加行数据表
                dtWindowsUser.Rows.Add(卓尔);
            }
        }
    }
}
 

解决方案

即使使用英语的系统上,您不想要检索的名字群体 - 他们可能与预期的重新命名。对于建在像管理员组要使用众所周知的SID 将工作无论用什么语言来命名该组。

WindowsXP中更改管理员帐户名称防止安全检测

这是获取你想要的数据...单向

 的SecurityIdentifier builtinAdminSid =新的SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid,NULL);

PrincipalContext CTX =新PrincipalContext(ContextType.Machine);

GroupPrincipal组= GroupPrincipal.FindByIdentity(CTX,builtinAdminsSid.Value);

的foreach(在group.Members主要P)
{
    Console.WriteLine(p.Name);
}
 

修改:使用WellKnownSidType的 @ jyoung的建议是一个比使用硬$ C $光盘魔法值如字符串builtinAdminsSidString =S-1-5-32-544更好的主意; 让我改变了上面的例子中code

I have a C# winform application that will be installed on Windows 7, Vista and XP machines, either 32 or 64 bit, with operating systems in English, German and Spanish (and other languages in the future).

I need to get a list of all admin and user account names on the local machine. I just need a list of the account names, nothing more.

The problem is my code works only for English language operating systems.

Is there a way to get the user names on a local machine regardless of language of the OS, and regardless of whether it is XP, Vista or 7, and regardless of whether it is 32 or 64 bit?

I read a post somewhere about using the SID to get the local admin name in case it has been renamed. Can using the SID be helpful in solving my problem?

Below is my code. On a German language OS computer, the code fails on the line "DirectoryEntry admGroup = localMachine.Children.Find("administrators", "group");". It fails here most likely because in the German OS the words "administrators", "group" are likely spelled differently. The same also is likely true for Spanish language OS.

My code for 32 bit OS:

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);
    }
}

My code for 64 bit OS:

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);
            }
        }
    }
}

解决方案

Even on a system using English, you don't want to retrieve groups by name - they could be renamed from what you expect. For built in groups like Administrators you want to use a well known SID which will work no matter what language is used to name the group.

This is one way to retrieve the data you want...

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);
}

Edit: @jyoung's suggestion of using WellKnownSidType is a much better idea than using a hard coded magic value like String builtinAdminsSidString = "S-1-5-32-544"; so I changed the example code above.

阅读全文

相关推荐

最新文章