Запрос WMI для получения включенных учетных записей пользователей. Что не так с моим предложением WHERE? - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь получить список не отключенных учетных записей пользователей на локальном компьютере со значениями SID для каждого пользователя. Я не мог заставить это работать с классом DirectoryEntry, потому что все возвращенные пользователи имели NULL в поле ObjectSecurity. Поэтому я попытался использовать 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");

Все это вызывает исключение. Может кто-нибудь сказать мне, как это сказать?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Вы неправильно используете SearchQuery; чтобы указать условие, вы должны либо дать полную строку запроса, либо использовать конструктор 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");
0 голосов
/ 09 февраля 2020
  • 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());
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...