Вопрос по c#, userprincipal, wmi, user-accounts – Как я могу получить список локальных пользователей Windows (только те пользователи, которые отображаются на экране входа в Windows)

9

Как я могу получить список локальных пользователей Windows (только те пользователи, которые отображаются на экране входа в Windows)

Я перепробовал много методов, используя библиотеку принципов Windows WMI Выберите команды. Я продолжаю получать Администратор, Гость и некоторые другие странные аккаунты (VUSRNEIL-DELL, $ HOMEGROUPUSER, ASPNET ... и т. д.)

Ни одна из этих трех учетных записей не отображается на экране входа в систему. Как я могу различать эти типы пользователей?

Я кодирую в C #

Ваш Ответ

4   ответа
5

Win32_UserAccount Вы можете отображать только те элементы, которые соответствуют следующим условиям:

ИмуществоAccountType имеетUF_NORMAL_ACCOUNT флаг.ИмуществоDisabled является .falseИмуществоLockout является .falseИмуществоLocalAccount является .trueИмуществоSIDType является .SidTypeUser

Если ты можешь't использовать WMI (или вы не хотите его использовать), тогда вам придется проделать немного больше работы, в основном вы должны использоватьNetGroupGetUsers функция для перечисления всех пользователей. Увидетьэта статья на CodeProject для примера.

12

Просто добавьте ссылку наSystem.Management в консольном приложении и попробуйте этот код:

using System;
using System.Management;
using System.Linq;

namespace ConsoleApplication5
{
    class Program
    {
        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["LocalAccount"] == true &&
                     (bool)u["Disabled"] == false &&
                     (bool)u["Lockout"] == false &&
                     int.Parse(u["SIDType"].ToString()) == 1 &&
                     u["Name"].ToString() != "HomeGroupUser$");

            foreach (ManagementObject user in localUsers)
            {
                Console.WriteLine("Account Type: " + user["AccountType"].ToString());
                Console.WriteLine("Caption: " + user["Caption"].ToString());
                Console.WriteLine("Description: " + user["Description"].ToString());
                Console.WriteLine("Disabled: " + user["Disabled"].ToString());
                Console.WriteLine("Domain: " + user["Domain"].ToString());
                Console.WriteLine("Full Name: " + user["FullName"].ToString());
                Console.WriteLine("Local Account: " + user["LocalAccount"].ToString());
                Console.WriteLine("Lockout: " + user["Lockout"].ToString());
                Console.WriteLine("Name: " + user["Name"].ToString());
                Console.WriteLine("Password Changeable: " + user["PasswordChangeable"].ToString());
                Console.WriteLine("Password Expires: " + user["PasswordExpires"].ToString());
                Console.WriteLine("Password Required: " + user["PasswordRequired"].ToString());
                Console.WriteLine("SID: " + user["SID"].ToString());
                Console.WriteLine("SID Type: " + user["SIDType"].ToString());
                Console.WriteLine("Status: " + user["Status"].ToString());
            }

            Console.ReadKey();
        }
    }
}
</managementobject>
Это работает хорошо, но может быть медленным. Когда я запускаю его на домене Windows 7, все мое приложение запускается за 5 секунд. Когда я запускаю его на Windows 2008 Server, все мое приложение занимает почти 3 минуты. Большая часть различий заключается в паузах при просмотре найденных пользователей. Robert Bratton
localusers в вашем примере - неиспользуемая переменная, для чего она в демоверсии? Offler
-2

их домен, полное имя и SID.

wmic useraccount get domain,name,sid
0

Если вы хотите использовать завернутое решение, NuGet имеетContinuous.Management» пакет - это проект с открытым исходным кодом:https://github.com/jarzynam/continuous

Похожие вопросы