Ceci est une ancienne révision du document !
L'objectif étant de permettre à ownCloud de monter automatiquement les disques réseaux paramétrer par les “Group Policy”
Le but étant de considérer que la personne déployant ownCloud a correctement configuré son domaine. Se faisant, aucune configuration ne devrait être nécessaire. Afin de supporter des installations multi-domaines, l'authentification est gérée par le même plugin et prend en compte le nom d'utilisateur 'username@domain'.
Sur un domaine “test.artnum.ch”, les GPO sont indiquées sur l'object dc=test,dc=artnum,dc=ch, attribut gPLink :
$ ldapsearch -s base -b "dc=test,dc=artnum,dc=ch" # ... <snip> gPLink: [LDAP://cn={5EE8813F-3AFE-483C-AC76-CB06FCFFDF0D},cn=policies,cn=syste m,DC=test,DC=artnum,DC=ch;2][LDAP://cn={0071FA96-BA06-4033-AB98-5FE59F5C0565} ,cn=policies,cn=system,DC=test,DC=artnum,DC=ch;2][LDAP://CN={31B2F340-016D-11 D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=test,DC=artnum,DC=ch;0] # ...
Une requête subséquente sur les éléments indiqué permet de trouver le chemin effectif des GPO, attribut gPCFileSysPath :
$ ldapsearch -s base -b "cn={5EE8813F-3AFE-483C-AC76-B06FCFFDF0D},cn=policies,cn=system,dc=test,dc=artnum,dc=ch" # ... <snip> gPCFileSysPath: \\test.artnum.ch\SysVol\test.artnum.ch\Policies\{5EE8813F-3AFE-483C-AC76-CB06FCFFDF0D} # ...
À partir du chemin sysvol, les disques réseaux se trouvent suivant le chemin 'User/Preferences/Drives' dans lequel se trouve un fichier Drives.xml
<?xml version="1.0" encoding="utf-8"?> <Drives clsid="{8FDDCC1A-0C3C-43cd-A6B4-71A6DF20DA8C}"><Drive clsid="{935D1B74-9CB8-4e3c-9914-7DD559B7A417}" name="F:" status="F:" image="2" changed="2019-02-27 16:23:02" uid="{D1796459-45F2-495A-953D-CB34DE5CF4BB}" userContext="1" bypassErrors="1"><Properties action="U" thisDrive="NOCHANGE" allDrives="NOCHANGE" userName="" path="\\samba.test.artnum.ch\finance" label="Finance" persistent="1" useLetter="1" letter="F"/></Drive> </Drives>
Pour trouver le serveur LDAP d'un domaine AD, il suffit de questionner DNS pour les enregistrement SRV, pour se faire :
function get_ldap ($domain) { foreach (array('_ldap._tcp.pdc._msdcs', '_ldap._tcp.dc._msdcs') as $i) { $dns_result = dns_get_record($i . '.' . $domain, DNS_SRV); if ($dns_result && !empty($dns_result) && !empty($dns_result[0]['target'])) { return $dns_result[0]['target']; } } return false; }
La première phase est de trouver le “naming context” de l'annuaire. Pour se faire une requête anonyme sur l'annuaire permet d'obtenir cette information :
function get_naming_context ($server) { $root = null; $lc = ldap_connect($server); if (ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, 3)) { $result = ldap_read($lc, '', '(objectclass=*)', array('namingcontexts')); if ($result && ($entry = ldap_first_entry($lc, $result))) { $nctx = ldap_get_values($lc, $entry, 'namingcontexts'); /* first one should be the naming context, but do some checking */ for ($i = 0; $i < $nctx['count']; $i++) { if (is_null($root)) { $root = $nctx[$i]; continue; } if (strpos(strtolower($nctx[$i]), strtolower($root)) === FALSE) { $root = $nctx[$i]; } } } } return $root; }