W mojej firmie komputery pracują w domenie. Użytkownicy logują się do nich za pomocą kont domenowych. Próbuję z serwera LDAP pobrać imię, nazwisko oraz adres e-mail. Niestety działanie skryptu kończy się ostrzeżeniem:
Warning: ldap_search(): Search: Operations error in C:\webserver\data\htdocs\ldap.php on line 11
<?php
try
{
$ldapConnection = ldap_connect("ad.domena.pl");
$path = "OU=Użytkownicy,OU=Piła,OU=Regiony,DC=ad,DC=domena,DC=pl";
ldap_set_option ($ldapConnection, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);
$searchFilter = "(cn=*)";
$search=ldap_search($ldapConnection, $path, $searchFilter);
$usersData = ldap_get_entries($ldapConnection, $search);
if ($usersData["count"] > 0)
{
foreach ($usersData as $userData)
{
echo "{$userData["cn"][0]} : {$userData["mail"][0]}";
}
ldap_close($ldapConnection);
}
}
catch (Exception $e)
{
echo "Wystąpił wyjątek\n\n:" . $e->getCode() . " : " . $e->getMessage();
}
?>
Stworzyłem analogiczny kod w C# i wszystko działa bez zastrzeżeń.
using System;
using System.DirectoryServices;
namespace activeDirectoryLdapExamples
{
class Program
{
static void Main(string[] args)
{
try
{
DirectoryEntry ldapConnection = new DirectoryEntry("ad.domena.pl");
ldapConnection.Path = "LDAP://OU=Użytkownicy,OU=Piła,OU=Regiony,DC=ad,DC=domena,DC=pl";
DirectorySearcher search = new DirectorySearcher(ldapConnection);
search.Filter = "cn=*";
SearchResultCollection usersData = search.FindAll();
if (usersData.Count > 0)
{
foreach ( SearchResult userData in usersData)
{
Console.WriteLine(string.Format("{0} : {1}", userData.Properties["cn"][0].ToString(), userData.Properties["mail"][0].ToString()));
}
}
ldapConnection.Close();
}
catch (Exception e)
{
Console.WriteLine("Wystąpił wyjątek:\n\n" + e.HResult + " : " + e.Message);
}
Console.ReadLine();
}
}
}
Żeby Outlook pobierał dane z książki adresowej LDAP muszą być poniższe ustawienia