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






2.67/5 (5投票s)
使用 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 日 - 初始发布