Ankündigung

Einklappen
Keine Ankündigung bisher.

Ordner von Linux aus auf einem Windows-Server erstellen und berechtigen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ordner von Linux aus auf einem Windows-Server erstellen und berechtigen

    Ich poste hier den Code, wie man von einem Apacheserver unter Linux einen Ordner unter einem Windows-Server erstellen kann, Sicherheitsgruppen in Active Directory erstellt und diese dann auf den Ordner berechtigt.
    Ich hoffe es hilft dem ein oder anderen.

    Für das Vorhaben habe ich das Symfony-Framework in Version 6.4 (LTS) verendet und den icewind/smb-Wrapper.
    Unter Linux muss außerdem "smbcacls" verfügbar sein.
    Informationen zu "smbcacls" die wichtig sind finden sich unter docs.redhat.com

    Die Verbindung zum LDAP-Server wird mittels LDAPS hergestellt. Ob es mit normalem LDAP funktioniert habe ich nicht probiert.

    Code:
    .env.local:
    # Serverkonfiguration
    LDAP_IP=<IP_des_Domäneservers>
    LDAP_PORT=636
    LDAP_OPT_REFERRALS=0
    LDAP_VERSION=3
    LDAP_ENCRYPTION=ssl
    LDAP_DOMAIN=<domain>
    LDAP_TLD=<tld>
    
    # Zugangsdaten LDAP
    LDAP_USERNAME=<Benutzer_mit_Administrator-Rechten>
    LDAP_PASSWORD=<Passwort_des_Benutzers>
    
    # OU-Bases
    LDAP_GLOBAL_GROUPS_BASE_DN=OU=GlobalGroups,OU=<Your_Custom_OU>,DC=<domain>,DC=<tld>
    
    # Freigaben
    LDAP_SHARES='<Share1>', '<Share2>'
    PHP-Code:
    # Ordner erstellen
    public function createLdapFolder(array $data): bool
    {

        
    $prefixMapping = [
            
    'general' => 'Allg_',
            
    'scan' => 'Scan_',
            
    'other' => '',
        ];

        
    $selectPrefix $data['selectPrefix'];
        
    $folderName $data['folderName'];

        
    // Prüfen auf ungültige Zeichen im Ordnernamen
        
    if (!preg_match('/^[a-zA-Z0-9_\-]+$/'$folderName)) {
            
    $this->requestStack->getCurrentRequest()->getSession()->getFlashBag()->add('error''Der Ordnername enthält ungültige Zeichen.');
            return 
    false;
        }

        
    // Prüfen, ob eine Kategorie ausgewählt wurde
        
    if (!isset($prefixMapping[$selectPrefix])) {
            
    $this->requestStack->getCurrentRequest()->getSession()->getFlashBag()->add('error''Ungültige Auswahl.');
            return 
    false;
        }

        
    $prefix $prefixMapping[$selectPrefix];
        
    $completeFolderName $prefix $folderName;
      
        
    $serverFactory = new ServerFactory();
        
    $auth = new BasicAuth($_ENV['LDAP_USERNAME'], $_ENV['LDAP_DOMAIN'], $_ENV['LDAP_PASSWORD']);
        
    $server $serverFactory->createServer($_ENV['LDAP_IP'], $auth);

        
    $shares $server->listShares();

        foreach (
    $shares as $shareName) {
            
    $shareName->getName();
        }

        
    // LDAP Shares aus der ENV-Datei
        
    $ldapShares array_map('trim'explode(','$_ENV['LDAP_SHARES']));

        
    // Share anhand von $selectPrefix bestimmen
        
    if ($selectPrefix === 'other') {
            
    $shareName in_array('Share2'$ldapShares) ? 'Share2' null;
        } else {
            
    $shareName in_array('Share1'$ldapShares) ? 'Share1' null;
        }
            
        try {
            
    // Order auf der Freigabe erstellen
            
    $share $server->getShare($shareName);
            
    $share->mkdir($completeFolderName);

            
    // Datenweitergabe um auf Basis des Ordernamens die entsprechenden Sicherheitsgruppen im AD zu erstellen.
            
    $this->createLdapFolderGroups($shareName$completeFolderName);

            return 
    true;
        } catch (\
    Exception $e) {
            throw new \
    Exception("Fehler beim Erstellen des Ordners: " $e->getMessage());
            return 
    false;
        }
            

    PHP-Code:
    # Sicherheitsgruppen im Active Directory erstellen:
    public function createLdapFolderGroups(string $shareNamestring $completeFolderName): bool
    {
            
        
    $baseDn 'OU=FolderGroups,' $_ENV['LDAP_GLOBAL_GROUPS_BASE_DN'];

        
    // Gruppe für Lesezugriff
        
    $entryRO = new Entry('cn=GG_Folder_' $completeFolderName '-RO,' $baseDn, [
            
    'sAMAccountName' => ['GG_Folder_' $completeFolderName '-RO'],
            
    'objectClass' => ['top''group'],
            
    'groupType' => [-2147483646],
        ]);

        
    // Gruppe für Lese- und Schreibzugriff
        
    $entryRW = new Entry('cn=GG_Folder_' $completeFolderName '-RW,' $baseDn, [
            
    'sAMAccountName' => ['GG_Folder_' $completeFolderName '-RW'],
            
    'objectClass' => ['top''group'],
            
    'groupType' => [-2147483646],
        ]);

        try {
            
    // Erstellen der Sicherheitsgruppen im Active Directory
            
    $this->ldap->getEntryManager()->add($entryRO);
            
    $this->ldap->getEntryManager()->add($entryRW);

            
    // Datenweitergabe um die Berechtigungsgruppen dem Ordner zuzuweisen
            
    $this->setFolderPermissions($shareName$completeFolderName);

            return 
    true;
        } catch (\
    Exception $e) {
            throw new \
    Exception("Fehler bei der Erstellung der Gruppe: " $e->getMessage());
            return 
    false;
        }


    PHP-Code:
    # Zuweisen der Sicherheitsgruppen zum erstellen Ordner und setzen der Berechtigungen
    private function setFolderPermissions(string $shareNamestring $completeFolderName)
    {

        
    // Die soeben erstellen Sicherheitsgruppen im Active Directory. Angabe der Domain ist hier verpflichtend
        
    $groupRO $_ENV['LDAP_DOMAIN']."\\GG_Folder_" $completeFolderName "-RO";
        
    $groupRW $_ENV['LDAP_DOMAIN']."\\GG_Folder_" $completeFolderName "-RW";

        try {
            
    // Vorbereiten des Befehls zum setzen der Leserechte
            
    $cmdRO "smbcacls //" $_ENV['LDAP_IP'] . "/" .
            
    $shareName " " escapeshellarg($completeFolderName) .
            
    " -U " $_ENV['LDAP_USERNAME'] . "%" $_ENV['LDAP_PASSWORD'] .
            
    " -a " escapeshellarg("ACL:{$groupRO}:ALLOWED/OI|CI/READ");

            
    // Vorbereiten des Befehls zum setzen der Schreibrechte
            
    $cmdRW "smbcacls //" $_ENV['LDAP_IP'] . "/" .
            
    $shareName " " escapeshellarg($completeFolderName) .
            
    " -U " $_ENV['LDAP_USERNAME'] . "%" $_ENV['LDAP_PASSWORD'] .
            
    " -a " escapeshellarg("ACL:{$groupRW}:ALLOWED/OI|CI/CHANGE");

            
    // Befehle ausführen
            
    exec($cmdRO$output$returnCode);
            
    exec($cmdRW$output$returnCode);
        } catch (\
    Exception $e) {
            throw new \
    Exception("Fehler beim Setzen der Ordnerberechtigung: " $e->getMessage());
            return 
    false;
        }


    PHP 8.3
    MariaDB 10.6
    Symfony 6.4 (LTS)
Lädt...
X