Как да търсите програмно принтер в 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) няма CN=Printers контейнер в Active Directory след инсталирането.

Принтерите се публикуват в Active Directory в съответния компютърен контейнер. Какво означава свързан компютърен контейнер? Е, отворете Active Directory Users and Computers MMC snap-in и следвайте тази процедура:

  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()));
      }
    }
  }
}

Разбира се, можете също да посочите като root за търсене 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? (Използване на C# път и филтър за търсене) - 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