【问题标题】:WMI Query to get enabled user accounts. What is wrong with my WHERE clause?WMI 查询以获取启用的用户帐户。我的 WHERE 子句有什么问题?
【发布时间】:2020-02-09 05:00:40
【问题描述】:

我正在尝试获取本地计算机上未禁用用户帐户的列表,其中包含每个用户的 SID 值。我无法使用 DirectoryEntry 类进行这项工作,因为返回的用户在 ObjectSecurity 字段中都有 NULL。所以我尝试使用 ManagementObjectSearcher

SelectQuery sQuery = new SelectQuery("Win32_UserAccount"); );
var searcher = new ManagementObjectSearcher(sQuery);

返回的用户有我需要的信息,但是这个查询给了我禁用的帐户。我想添加一个 WHERE 子句来说明这一点,但我做错了。

我试过了

new SelectQuery("Win32_UserAccount WHERE NOT Disabled");
new SelectQuery("Win32_UserAccount WHERE Disabled='False'");
new SelectQuery("Win32_UserAccount WHERE Disabled=False");

所有这些都会导致异常。谁能告诉我这个词怎么写?

【问题讨论】:

  • 您要查询 SID 值吗?
  • 您应该查看SelectQuery 的文档;你没有正确使用它。但更好的是,IMO,您可以通过使用带有查询字符串的ManagementObjectSearcher 的构造函数来简化它:new ManagementObjectSearcher("SELECT * FROM Win32_UserAccount WHERE Disabled=False")
  • 就是这样。猜猜我是否在为 WHERE 子句而烦恼,我应该为“SELECT”部分烦恼!
  • 下面的答案对@Joe 有帮助吗?
  • 确实如此。我首先看到了herohtar的答案(这也是正确的)并标记了答案。如果我的答案顺序错误,请道歉

标签: c# .net wmi


【解决方案1】:

你没有正确使用SearchQuery;要指定条件,您必须提供 full 查询字符串,或者使用单独接受查询的 SearchQuery(String, String) 构造函数:

var query = new SelectQuery("SELECT * FROM Win32_UserAccount WHERE Disabled=False");
var searcher = new ManagementObjectSearcher(query);

var query = new SelectQuery("Win32_UserAccount", "Disabled=False");
var searcher = new ManagementObjectSearcher(query);

但是,您可以使用直接接受查询字符串的ManagementObjectSearcher(String) 构造函数来简化代码:

var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_UserAccount WHERE Disabled=False");

【讨论】:

    【解决方案2】:
    • ManagementObjectSearcher 在我们的例子中根据指定查询检索管理对象集合SELECT * FROM Win32_UserAccount

    • userSearcher.Get() :调用指定的 WMI 查询并返回结果集合。


    在引用中添加System.Management

    static void Main(string[] args)
     {
        ManagementObjectSearcher usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount");
        ManagementObjectCollection users = usersSearcher.Get();
    
        var localUsers = users.Cast<ManagementObject>().Where(
            u => (bool)u["Disabled"] == false);
    
        foreach (ManagementObject user in localUsers)
        {
            Console.WriteLine("Account Type: " + user["AccountType"].ToString());               
            Console.WriteLine("Full Name: " + user["FullName"].ToString());
            Console.WriteLine("SID: " + user["SID"].ToString());
            Console.WriteLine("SID Type: " + user["SIDType"].ToString());
            Console.WriteLine("Status: " + user["Status"].ToString());
                Console.WriteLine("Disabled: " + user["Disabled"].ToString());
            Console.WriteLine("Domain: " + user["Domain"].ToString());
        }
     }
    

     static void Main(string[] args)
     {
        ManagementObjectSearcher usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount WHERE Disabled=False");
        ManagementObjectCollection users = usersSearcher.Get();
    
    
        foreach (ManagementObject user in users)
        {
            Console.WriteLine("Account Type: " + user["AccountType"].ToString());               
            Console.WriteLine("Full Name: " + user["FullName"].ToString());
            Console.WriteLine("SID: " + user["SID"].ToString());
            Console.WriteLine("SID Type: " + user["SIDType"].ToString());
            Console.WriteLine("Status: " + user["Status"].ToString());
                Console.WriteLine("Disabled: " + user["Disabled"].ToString());
            Console.WriteLine("Domain: " + user["Domain"].ToString());
        }
     }
    

    【讨论】:

    • 当你可以直接在查询字符串中写条件时,这里没有理由使用LINQ。
    • 我更新了使用和不使用 LINQ 的方式,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多