Как программно найти принтер в Active Directory

Попытка найти принтеры/общие ресурсы в Active Directory с помощью C#.

Это мой пример кода, который работает для пользователей, однако я не вижу возможности найти принтер, использующий ту же концепцию. (Я новичок в Active Directory).

    DirectoryEntry entry = new DirectoryEntry();
    entry.Path = "LDAP://xxx.xxx.xx.xx/CN=Printers;DC=domainName, DC=com";
    entry.Username = @"domainName.com\Administrator";
    entry.Password = "admin";

    DirectorySearcher search = new DirectorySearcher(entry);
    search.Filter = "(objectCategory=printQueue)";
    SearchResult result = search.FindOne();

    if (result != null)
    {
        ResultPropertyCollection fields = result.Properties;

        foreach (String ldapField in fields.PropertyNames)
        {

            foreach (Object myCollection in fields[ldapField])
                Console.WriteLine(String.Format("{0,-20} : {1}",
                              ldapField, myCollection.ToString()));
        }
    }

Будем очень благодарны любой помощи.


person acolene    schedule 06.05.2012    source источник


Ответы (1)


В отличие от пользователей (CN=Users) после установки в Active Directory нет контейнера CN=Printers.

Принтеры публикуются в Active Directory в соответствующем контейнере компьютеров. Что означает связанный компьютерный контейнер? Что ж, откройте оснастку MMC «Пользователи и компьютеры Active Directory» и выполните следующую процедуру:

  1. Выберите дополнительные функции в меню просмотра.
  2. Выберите «Пользователи», «Контакты», «Группы» и «Компьютеры» в качестве контейнеров в меню просмотра.
  3. Перейдите к объекту компьютера (который теперь отображается как контейнер), которому принадлежит ваш принтер.
  4. Нажмите на плюсик контейнера компьютера. Там вы увидите объект принтера.

Итак, вы видите, что принтеры публикуются в Active Directory в соответствующем контейнере компьютера (к которому принадлежит принтер), а не в одном общем контейнере, таком как CN=Printers.

Таким образом, для поиска объекта принтера в Active Directory необходимо указать другой путь LDAP. Например, вы можете указать корень вашей Active Directory в качестве корня поиска:

using (DirectoryEntry entry = new DirectoryEntry())
{
  entry.Path = "LDAP://xxx.xxx.xxx.xxx/DC=domainName,DC=com";
  entry.Username = @"domainName.com\Administrator";
  entry.Password = "SecurePassword";

  using (DirectorySearcher search = new DirectorySearcher(entry))
  {
    search.Filter = "(objectCategory=printQueue)";
    SearchResult result = search.FindOne();

    if (result != null)
    {
      ResultPropertyCollection fields = result.Properties;

      foreach (String ldapField in fields.PropertyNames)
      {
        foreach (Object myCollection in fields[ldapField])
          Console.WriteLine(String.Format("{0,-20} : {1}",
                          ldapField, myCollection.ToString()));
      }
    }
  }
}

Конечно, вы также можете указать в качестве корня поиска путь LDAP к компьютеру, на котором находится общий доступ к вашему принтеру. Например, если ваш принтер используется совместно на компьютере с именем server10, и этот компьютер находится в контейнере CN=Computers, укажите этот путь LDAP:

LDAP://xxx.xxx.xxx.xxx/CN=server10,CN=Computers,DC=domainName,DC=com

Если вы используете общий принтер на контроллере домена, путь LDAP немного отличается (поскольку по умолчанию объекты компьютеров контроллера домена расположены в организационной единице OU=Domain Controllers):

LDAP://xxx.xxx.xxx.xxx/CN=DomainControllerName,OU=Domain Controllers,DC=domainName,DC=com
person Hans    schedule 06.05.2012
comment
Привет! Большое спасибо! У меня другой вопрос по Active Directory: я вижу в возвращаемых свойствах принтера отсутствует ACL (список управления доступом), можно ли узнать, кто должен иметь доступ к принтеру из Active Directory? (с использованием пути С# и фильтра поиска) - person acolene; 06.05.2012
comment
@acolene: Какой ACL вы имеете в виду? Для объекта принтера в активном каталоге или для общего принтера? - person Hans; 06.05.2012
comment
Для общего доступа к принтеру? Если это возможно? - person acolene; 06.05.2012
comment
@acolene: Насколько я знаю, ACL для общего принтера не хранится в Active Directory. - person Hans; 06.05.2012
comment
И последний вопрос. Могу ли я искать общий ресурс так же, как и принтер? Если да, то каково значение ObjectCategory для SharedFolder? - person acolene; 06.05.2012
comment
@acolene: Да, вы можете искать общие ресурсы в Active Directory. Конечно, объект для общей папки должен существовать. Объектная категория для общей папки — «Том». - person Hans; 06.05.2012
comment
Спасибо. Работал отлично. Я искал список категорий объектов в Интернете, но не нашел его. В очередной раз благодарим за помощь. - person acolene; 07.05.2012
comment
@Hans, +1 за ваш ответ, после поиска принтера в AD есть ли способ добавить / сопоставить этот принтер, я искал это некоторое время, не смог найти ни одной статьи об этом, заранее спасибо - person Clint; 30.05.2018