65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WMI.NET 和 C# 枚举用户

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.67/5 (5投票s)

2008 年 1 月 9 日

CPOL

1分钟阅读

viewsIcon

83844

downloadIcon

962

使用 WMI.NET 和 C# 枚举所有可用用户和组

引言

最近,我需要获取本地机器上的所有用户名。我一直在寻找合适的方法,但确实很难找到。我知道我需要使用 WMI,但最大的障碍是如何组合不同的 WMI 查询来获得结果。

背景

立即出现在我脑海中的 WMI 类如下:

每个类都有其自身的用途。但是,Win32_Account 是主类,而其他类都继承自 Win32_Account

Using the Code

要获取所有用户帐户,您可以直接查询

select * from Win32_UserAccount where Domain=’YOURDOMAIN’

要获取所有组,您可以直接查询

select * from Win32_GroupUser where Domain=’YOURDOMAIN’

使用 C# 获取用户帐户

public static void GetUsers()
{
     SelectQuery sQuery = new SelectQuery(“Win32_UserAccount”,“Domain=’CHAKS-PC’”);

     try
     {
            ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery);

            Console.WriteLine(“User Accounts”);
            Console.WriteLine(“”);

            foreach (ManagementObject mObject in mSearcher.Get())
            {
                Console.WriteLine(mObject[“Name”]);
            }
      }
      catch (Exception ex)
      {
            Console.WriteLine(ex.ToString());
      }

     Console.ReadKey();
 }

使用 C# 获取组

public static void GetGroups()
 {
       SelectQuery sQuery = new SelectQuery(“Win32_Group”, “Domain=’CHAKS-PC’”);

       try
       {
             ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery);

             Console.WriteLine(“Groups”);
             Console.WriteLine(“”);

             foreach (ManagementObject mObject in mSearcher.Get())
             {
                 Console.WriteLine(mObject[“Name”]);
             }
        }
        catch (Exception ex)
        {
             Console.WriteLine(ex.ToString());
        }

        Console.ReadKey();
 }

现在,要获取与特定组对应的用户,我们需要查询 Win32_GroupUser ,这就需要一些技巧了。

Win32_GroupUser 是一个关联类,它关联一个组和该组的成员帐户。

因此,我们的查询现在变为

select * from Win32_GroupUser where _
    GroupComponent=’”‘Win32_Group.Domain=’domain-name’,Name=’group-name””‘

我们的 C# 代码变为

public static void GetUsers(String DomainName, String GroupName)
{
      #region Build WMI query using SelectQuery
      ///<summary>
      /// Alternate method for building query
      /// Which I think is better approach
      ///</summary>
      StringBuilder sBuilder = new StringBuilder(“GroupComponent=”);
      sBuilder.Append(‘”‘);
      sBuilder.Append(“Win32_Group.Domain=”);
      sBuilder.Append(“‘”);
      sBuilder.Append(DomainName);
      sBuilder.Append(“‘”);
      sBuilder.Append(“,Name=”);
      sBuilder.Append(“‘”);
      sBuilder.Append(GroupName);
      sBuilder.Append(“‘”);
      sBuilder.Append(‘”‘);
      SelectQuery sQuery = new SelectQuery(“Win32_GroupUser”, sBuilder.ToString());
      #endregion           

      ///<summary>
      /// Execute the query
      /// Construct a ManagementPath from the PartComponent and check for ClassName
      /// and extract the UserName
      /// Depending on which method you used to build the query,
      /// pass the String or SelectQuery object to ManagementObjectSearcher
      ///</summary>
      try
      {
            ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(sQuery);
            foreach (ManagementObject mObject in mSearcher.Get())
            {
                 ManagementPath path = 
                        new ManagementPath(mObject[“PartComponent”].ToString());
                 if (path.ClassName == “Win32_UserAccount”)
                 {
                      String[] names = path.RelativePath.Split(‘,’);
                      Console.WriteLine(names[1].Substring(names[1].IndexOf(“=”) 
                            + 1).Replace(‘”‘, ‘ ‘).Trim());
                 }
            }
      }
      catch (Exception ex)
      {
            Console.WriteLine(ex.ToString());
      }

      Console.ReadKey();
}

希望您喜欢阅读我的文章。

如果您有任何疑问,请随时给我发电子邮件或在下方开始讨论。

历史

  • 2008 年 1 月 10 日 - 初始发布
使用 WMI.NET 和 C# 枚举用户 - CodeProject - 代码之家
© . All rights reserved.