Как вывести список пользователей с ПК, которые он создал в папке winnt (локальные пользователи и группы) или в активном каталоге (под доменом), используя c # .net - PullRequest
0 голосов
/ 10 декабря 2011

Я реализовал приложение c # windows.

Для этого приложения я хочу предоставить учетные данные из учетных данных пользователя Windows.

Теперь проблема в том, что мне нужно получить список пользователей с Windows PC через код.

Как получить список пользователей: пользователь, созданный в папке winnt (в локальных пользователях и группах), или пользователь, созданный в домене активного каталога.

У меня есть идея получить список пользователей из папки winnt,

DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
// DirectoryEntry admGroup = localMachine.Children.Find("Guests", "group");
// DirectoryEntry admGroup = localMachine.Children.Find("administrators", "group");
DirectoryEntry admGroup = localMachine.Children.Find("users", "group");
//DirectoryEntry admGroup = localMachine.Children.Find("TestUser1", "group");
object members = admGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
    DirectoryEntry member = new DirectoryEntry(groupMember);
    listBox1.Items.Add(member.Name);
} 

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

Любое тело дает мне код для перекрестной проверки пользователей с помощью кода c #

1 Ответ

1 голос
/ 10 декабря 2011

Для части Active Directory, и если вы используете .NET 3.5 или новее, вы можете заглянуть в новое пространство имен System.DirectoryServices.AccountManagement.

Вы можете использовать PrincipalSearcher и принцип «запрос за примером» для поиска:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for a UserPrincipal 
UserPrincipal qbeUser = new UserPrincipal(ctx);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

List<string> userNames = new List<string>();

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal"
    if(!userNames.Contains(found.Name))
    {
       userNames.Add(found.Name);
    }
}

Если вы этого еще не сделали - обязательно прочитайте статью MSDN Управление принципами безопасности каталогов в .NET Framework 3.5 , в которой хорошо показано, как наилучшим образом использовать новые функции в System.DirectoryServices.AccountManagement

Для учетных записей локальных компьютеров вы можете сделать в основном то же самое - просто с другим PrincipalContext:

// create your local machine context
PrincipalContext local = new PrincipalContext(ContextType.Machine);

Остальная часть кода идентична - но у ваших основных объектов может быть гораздо меньше фактически заполненных свойств (поскольку учетные записи локального компьютера хранят не так много информации для них, как учетные записи Active Directory) - но каждый Принципал определенно имеет по крайней мере .Name свойство!

...