Определение существующих локальных учетных записей Windows через .NET - PullRequest
1 голос
/ 06 июля 2011

В приложении C # я использую следующий код, чтобы определить существующие локальные учетные записи Windows (по некоторым причинам, фильтруя встроенные участники безопасности):

ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_Account Where LocalAccount = True AND Status = 'OK' AND (SidType = 1 OR SidType = 5)" + 
                 " AND (SID <> 'S-1-3-3' AND SID <> 'S-1-3-2' AND SID <> 'S-1-5-9' " + 
                 "      AND SID <> 'S-1-5-8' AND SID <> 'S-1-5-10' AND SID <> 'S-1-5-12' " + 
                 "      AND SID <> 'S-1-2-0')");
ManagementObjectCollection objects = searcher.Get();
foreach (ManagementBaseObject obj in objects)
{
    ....
}

Теперь яищет альтернативный метод / способ для определения существующих локальных учетных записей Windows, как описано выше, потому что этот метод не очень стабилен -> иногда выдается COMException (при выполнении searcher.Get ()):

System.Runtime.InteropServices.COMException (0x800706BA) в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo) в System.Management.ManagementEjectObjectObjectCject

На мой взгляд, исключение не определено.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Если вы используете .NET 3.5 и выше, вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM).Прочитайте все об этом здесь:

По сути, вы можете определить контекст (включая «машинный» контекст для локальных учетных записей), а затем легко найти пользователей и / или группы:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Machine);

// find all users - define a "UserPrincipal" as your "QBE" principal
UserPrincipal qbeUser = new UserPrincipal(ctx);

// enumerate all users
PrincipalSearcher searcher = new PrincipalSearcher(qbeUser);

foreach(Principal p in searcher.FindAll())
{
    // do something here
}

Новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD:

2 голосов
/ 06 июля 2011

Я не совсем понимаю, что вам нужно, но вот хороший пример получения всех учетных записей Windows в системе

http://csharptuning.blogspot.com/2007/09/how-to-get-list-of-windows-user-in-c.html

и чтобы получить текущего системного пользователя, просто напишите

System.Security.Principal.WindowsIdentity.GetCurrent()

Вы также можете сделать что-то вроде этого

static void Main(string[] args)
    {
        SelectQuery query = new SelectQuery("Win32_UserAccount");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        foreach (ManagementObject envVar in searcher.Get())
        {
            Console.WriteLine("Username : {0}", envVar["Name"]);
        }

        Console.ReadLine();

    }
...