如何以编程方式在 Active Directory 中搜索打印机

Posted

技术标签:

【中文标题】如何以编程方式在 Active Directory 中搜索打印机【英文标题】:How to programmatically search a printer in Active Directory 【发布时间】:2012-05-06 04:37:59 【问题描述】:

尝试使用 C# 在 Active Directory 中查找打印机/共享。

这是我的示例代码,适用于用户,但我看不到能够使用相同概念找到打印机。 (我是 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()));
        
    

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

与用户 (CN=Users) 相比,安装后 Active Directory 中没有 CN=Printers 容器。

打印机在相关计算机容器的 Active Directory 中发布。做什么 相关的电脑容器是什么意思?好吧,打开 Active Directory 用户和计算机 MMC 管理单元,然后 遵循以下程序:

    在视图菜单中选择高级功能。 在视图菜单中选择用户、联系人、组和计算机作为容器。 导航到计算机对象(现在显示为容器) 您的打印机属于。 单击计算机容器的加号。在那里你会看到 打印机对象。

因此,您会看到打印机在 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

【讨论】:

您好,非常感谢!我还有另一个 Active Directory 问题:我在为打印机返回的属性中看到没有 ACL(访问控制列表),是否可以找出谁应该可以从 Active Directory 访问打印机? (使用 C# 路径和搜索过滤器) @acolene:你指的是哪个 ACL?对于活动目录中的打印机对象或打印机共享? 打印机共享?如果可以吗? @acolene:据我所知,打印机共享的 ACL 并未存储在 Active Directory 中。 最后一个问题。我可以像搜索打印机一样搜索共享吗?如果是,SharedFolder 的 ObjectCategory 值是多少?

以上是关于如何以编程方式在 Active Directory 中搜索打印机的主要内容,如果未能解决你的问题,请参考以下文章

访问Azure Active Directory用户和角色

如何使用远程 LDAP 客户端确定 Active Directory 服务器的*版本*?

在 Azure Active Directory 上启用 CORS

C#:如何在启用 SSL 的情况下连接到 Active Directory?

Alfresco - 如何让管理员无法从 Active Directory 中删除用户

在 NodeJS 后端使用 JWT 和 Active Directory 身份验证