Получение списка пользователей Windows - C#

Узнай цену своей работы

Формулировка задачи:

Получаем список всех локальных пользователей на компьютере Вариант №1
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
foreach (DirectoryEntry child in localMachine.Children)
            {
                if (child.SchemaClassName == "User")
                {
                    listBox1.Items.Add(child.Name + Environment.NewLine);
                    listBox2.Items.Add(child.Name + Environment.NewLine);
                }
            }
Работает, но работает до неприличия медленно, может быть можно как-то ускорить процесс? Вариант №2 через WMI
  ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\\CIMV2",
                    "SELECT * FROM Win32_UserAccount WHERE LocalAccount=True");
foreach (ManagementObject envVar in searcher.Get())
            {
                listBox1.Items.Add(envVar["Name"] + Environment.NewLine);
                listBox2.Items.Add(envVar["Name"] + Environment.NewLine);
            }
Не выводит ничего, хотя всё должно работать. Ну и собственно вопросы, можно ли сделать вариант №1 с удобоваримой скоростью или же в чём проблема в варианте №2? Кстати, если убрать
WHERE LocalAccount=True
из запроса, то скорость выполнения второго варианта станет сравнима со скоростью первого, однако же результата не будет всё равно никакого.

Решение задачи: «Получение списка пользователей Windows»

textual
Листинг программы
using System;
using System.Management;
using System.Windows.Forms;
 
namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\CIMV2", 
                    "SELECT * FROM Win32_UserAccount"); 
 
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_UserAccount instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Name: {0}", queryObj["Name"]);
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы