Получение пользователей компьютера - PullRequest
1 голос
/ 20 июля 2010

Я пытаюсь получить список локальных пользователей компьютера, используя следующий код.

       internal void GetUsers()
       {
        try
        {
            List<string> adUsers = new List<string>();
            DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);

            foreach (DirectoryEntry child in directoryEntry.Children)
            {
                if (child.SchemaClassName.Equals("User", StringComparison.OrdinalIgnoreCase))
                {
                    adUsers.Add(child.Name);
                }
            }
        }
        catch (Exception ex)
        {
            //Exception
        }
    }

Этот код отлично работает на моем компьютере. Однако, когда я тестировал его на нескольких других компьютерах, в список были включены следующие системные пользователи:

ASPNET, HelpAssistant

Может ли кто-нибудь пролить свет на то, как я могу избавиться от этих системных пользователей и получить только пользователей, которые фактически входят в систему, то есть обычных пользователей.

Спасибо, Ram

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Не ответ как таковой, но некоторые предложения, которые могут помочь.

Я думаю, проблема в том, что эти учетные записи не являются реальными системными учетными записями, поэтому их не так легко отличить.

Вы можете взглянуть на классы WMI Win32_UserAccount и Win32_UserProfile и посмотреть, есть ли там какие-либо свойства, которые могут указывать, какие учетные записи пользователей являются обычными, и какие из них вы упоминаете,В частности, возможно, свойства 'SIDType' или 'AccountType' Win32_UserAccount или, возможно, свойство Special класса Win32_UserProfile.

Возможно, это другие классы WMI, на которые также стоит обратить внимание.

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

1 голос
/ 20 июля 2010

Вы пытались перечислить коллекцию свойств в DirectoryEntry?

    using (DirectoryEntry dirEntry = new DirectoryEntry(strchild))
    {
        foreach (string strPropertyName in dirEntry.Properties.PropertyNames)
        {
            Console.WriteLine(strPropertyName + " " + dirEntry.Properties[strPropertyName].Value.ToString());
        }
    }

Кроме этого, вам может потребоваться выполнить поиск LDAP в Active Directory, чтобы найти найденное имя пользователя для пользователя ActiveDirectory.
Посмотрите на эту статью. http://www.codeproject.com/KB/system/everythingInAD.aspx

Веселись.

0 голосов
/ 06 мая 2016

Следующий код даст вам локальных пользователей, которые на самом деле имеют локально доступные папки.Если лучший разработчик C # может реорганизовать код, чтобы он стал чище - помогите!

var localDrives = Environment.GetLogicalDrives();
var localUsers = new List<string>();
var query = new SelectQuery("Win32_UserAccount") { Condition = "SIDType = 1 AND AccountType = 512" };
var searcher = new ManagementObjectSearcher(query);

foreach (ManagementObject envVar in searcher.Get())
{
    foreach (string drive in localDrives)
    {
        var dir = Path.Combine(String.Format("{0}Users", drive), envVar["name"].ToString());
        if (Directory.Exists(dir))
        {
            localUsers.Add(envVar["name"].ToString());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...