Gebruikersmanagement (1)
Data ophalen, data wegschrijven, data bijwerken allemaal zaken waarvoor een data opslagplaats hoofdzakelijk voor is bedoeld. Zoals al eerder is verteld in één van de voorgaande hoofdstukken is een Active Directory implementatie ook een soort database. Het is daarom in dit artikel en de artikelen die hierna nog zullen volgen zeer belangrijk dat je scherp hebt hoe de structuur van Active Directory in elkaar zit. Wanneer je dit niet meer weet, of het niet meer zeker weet kan je het beste even een stapje terug doen en (nogmaals) hoofdstuk 1 lezen.
Hieronder genoteerd wat in dit artikel qua gebruikersmanagement behandeld gaat worden:
- Het realiseren van een export van alle gebruiker die in Active Directory zijn opgeslagen.
- Het creëren van een nieuwe gebruiker.
- Het toevoegen / wijzigen van gebruikers attributen.
- Het samenstellen van een gebruiker informatie schema.
Wanneer ik alles in één hoofdstuk zou plaatsen zou het onoverzichtelijk worden, vandaar dat het hoofdstuk "Gebruikersmanagement" een aantal (sub)delen heeft.
Het exporteren van gebruikers:
Het kan zo zijn dat je alle gebruikers die in Active Directory zitten wilt opvragen. Denk aan bijvoorbeeld een gebruikersoverzicht. Hieronder eerst een functie die dat mogelijk maakt waarna zal worden uitgelegd wat de functie nu precies doet en hoe het exporteren van de gebruikers tot stand komt.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function exportUsers($ldapConnection, $config = array())
{
$filter = '(&(objectClass=user)(samaccounttype=' .$config['samaccounttype']. ')(objectCategory=person)(cn=' .$config['search']. '))';
$fields = array(
'samaccountname',
'displayname'
);
$search = ldap_search($ldapConnection, $config['baseDn'], $filter, $fields);
if (!$search) {
trigger_error('Er is een fout opgetreden bij het zoeken in Active Directory. Error: ' .ldap_error($ldapConnection), E_USER_ERROR);
exit;
}
$entries = ldap_get_entries($ldapConnection, $search);
if (!$entries) {
trigger_error('Er is een fout opgetreden bij het ophalen van de gegevens uit Active Directory. Error: ' .ldap_error($ldapConnection), E_USER_ERROR);
exit;
}
$users = array();
for ($i = 0; $i < $entries['count']; $i++) {
if (false !== $config['includeDescription']) {
$users[] = array(
'name' => $entries[$i]['samaccountname'][0],
'description' => (isset($entries[$i]['displayname']) && !is_null($entries[$i]['displayname'][0])) ? $entries[$i]['displayname'][0] : $entries[$i]['samaccountname'][0]
);
}
else {
array_push($users, $entries[$i]['samaccountname'][0]);
}
}
if ($config['sort']) {
asort($users);
}
return $users;
}
?>
Er zijn een aantal zaken van belang voor het exporteren van alle gebruikers:
- Een connectie met de Active Directory server. (Let op, deze functie controleert niet of er daadwerkelijk een connectie aanwezig is)
- Een LDAP "binding" zoals die in het vorige hoofdstuk is besproken. (Ook voor dit punt geldt dat niet wordt gecontroleerd of er daadwerkelijk een LDAP "binding" aanwezig is)
Wanneer je niet meer precies weet hoe je een connectie opzet, of hoe je een gebruiker aan Active Directory "bind" (verbind) kan je het beste voorgaande artikelen (nogmaals) lezen.
Als tweede parameter wordt er een array met configuratie verwacht. Zo'n array kan er als volgt uit zien:
2
3
4
5
6
7
8
9
10
11
$schemaConfig = array(
'includeDescription' => false,
'search' => '*',
'sort' => true,
'baseDn' => 'DC=nielskieviet,DC=local',
'samaccounttype' => 805306368 // Standaard account type
);
?>
Alle waarden in de array zijn verplicht, Er wordt in de bovenstaande functie niet gecontroleerd of de waarden daadwerkelijk in de array zitten. Wanneer je de functie gaat gebruiken is het aan jezelf of je die controles nog toevoegt.
- includeDescription:
Wanneer je includeDescription op true zet retourneert de functie een twee-dimensionale array. Het retourneren van een associatieve array is ook mogelijk, maar dan moet je de for-loop in de functie aanpassen. (Zie onderstaande)
2
3
4
5
6
7
8
9
10
11
12
13
for ($i = 0; $i < $entries['count']; $i++) {
if (false !== $config['includeDescription']) {
// Associatieve array
$users[$entries[$i]['samaccountname'][0]] = (isset($entries[$i]['displayname']) && !is_null($entries[$i]['displayname'][0])) ? $entries[$i]['displayname'][0] : $entries[$i]['samaccountname'][0];
}
else {
array_push($users, $entries[$i]['samaccountname'][0]);
}
}
?>
Er wordt eerst gekeken of de "displayName" van de gebruiker niet leeg is. ("displayName" is de uitvoerige naam met informatie van de gebruiker), wanneer deze niet leeg is wordt die aan de array toegevoegd, en anders wordt de accountnaam / gebruikersnaam in de array geplaatst.
- Search:
De * betekend dat er geen criteria van toepassing is. Later in deze reeks met artikelen zal er verder uitleg komen en aan de hand van wat voorbeelden worden uitgelegd welke parameters je kan gebruiken.
- Sort:
De sort parameter is een boolean welke aangeeft of de resultaten van de zoekactie aan het eind nog alfabetisch moeten worden gesorteerd. Je kan het eventueel nog uitbreiden / aanpassen met de mogelijkheid tot het sorteren op andere volgorde methodes.
- baseDn:
De baseDn is je domeinnaam op dezelfde manier als de "account suffix" uit het vorige artikel. Voorbeeld: DC=nielskieviet,DC=local.
- samaccounttype:
In deze variabele moet het type account worden opgenomen. Je hebt de volgende "samaccountypes":
- 805306368 - Normaal account
- 805306369 - Vertrouwend werkstation
- 805306370 - Vertrouwend domein
- 268435456 - Globale security groep
- 536870912 - Lokale security groep
- 268435457 - Globale distributie groep
- 536870913 - Lokale distributie groep
Aangezien je voor het exporteren van alle gebruikers het accountype 'Normaal account (805306368)' nodig hebt, is die in de array opgenomen.
Het resultaat van export van de gebruikers zonder "includeDescription" kan er dan als volgt uit zien:
Met "includeDescription" ziet een voorbeeld array er zo uit. (twee-dimensionale array)
2
3
4
5
6
7
8
9
10
11
12
13
(
[0] => Array
(
[name] => Niels
[description] => Niels kieviet
)
[1] => Array
(
[name] => Hendrik
[description] => Hendrik kieviet
)
)
En een "includeDescription" met een associatieve array.
Nog een laatste opmerking, houdt er rekening mee dat tot en met PHP5.3 PHP niet meer dan 1000 resultaten op kan halen. Dit komt omdat PHP dan nog geen paged results ondersteund. In PHP 5.4 is dit probleem opgelost.
Ik hoop dat je er wat van geleerd hebt, en wanneer je vragen hebt.. Schroom je niet om ze te stellen!
Inhoudsopgave
- Wat is Active Directory en wat houd het in?
- LDAP protocol plus verschillende mogelijkheden.
- Connecteren met Active Directory
- Authenticatie en Active Directory
- Gebruikersmanagement (1)