Eu não acho que haja uma linha única que possa fazer isso. Você pode roteirizar (ou codificar) isso, no entanto.
Praticamente qualquer pesquisa LDAP que você faça no AD envolverá o função ldap_search_s () . Uma das coisas que a função exige é uma base para iniciar a pesquisa. "DC = domain, DC = com" por exemplo. Você pode usar qualquer unidade organizacional ou contêiner como sua base para iniciar sua pesquisa. Para usar o seu exemplo, pode parecer "OU = opt, DC = domínio, DC = com". Você não pode usar curingas nessa string.
Assim, em seu script hipotético, você executa a consulta com a base de pesquisa mencionada acima e usa o filtro (objectclass = container) e especifica o escopo ( base, um nível ou subárvore ) da pesquisa. Isso lhe dará uma lista de todos os contêineres em sua base de pesquisa.
Em seguida, no seu script, você pode executar mais consultas incorporando cada um dos elementos da sua lista de contêineres. ("OU = lib, UO = dallas , OU = opt, DC = domínio, DC = com", "OU = lib, UO = atlanta , UO = opt, DC = domínio, DC = com ", etc.)
Os bits em negrito representam a variável no seu script e você faria uma consulta separada para cada contêiner encontrado em sua primeira pesquisa por contêineres.
Isso soa muito louco para mim. Você também precisa descobrir como lidar com a recursão em uma pesquisa de subárvore, etc.
Outra abordagem seria apenas pesquisar o (s) objeto (s) que você deseja pesquisar e verificar programaticamente se o contêiner pai imediato de cada objeto é OU = lib e descartá-los, se não estiver. Isso provavelmente um pouco menos insano.
Mas o ponto é, você vai ter que escrever ou codificar. Caracteres curinga podem ser usados para atributos de objetos * (número de telefone = ** 555) * ou tipos de objetos (objectclass = user) , mas não para os nós em uma base de pesquisa.