2017-07-03 5 views
1

Nous essayons de comparer les autorisations NTFS pour les fichiers ou les dossiers en utilisant l'attribut SDDL. La seule chose qui nous intéresse est si l'ACL est égale ou non, en utilisant le SDDL et pas d'autres méthodes comme AccessToString ou simplement en comparant deux objets ACL. C'est parce que nous avions des problèmes dans le passé avec la manière standard de le faire.Fichier SDDL non égal bien qu'il devrait être

Donc, nous allons maintenant exécuter un problème où File1 et File2 ont exactement les mêmes autorisations lors de la vérification de l'onglet Advanced Permissions dans Windows. Cependant, le SDDL dit que ce n'est pas égal, bien que nous enlevions la partie Owner O: de la chaîne SDDL comme indiqué here, car le propriétaire ne nous intéresse pas.

Le code:

Function Test-ACLequal { 
    Param (
     $Source, 
     $Target 
    ) 

    $CompParams = @{ 
     ReferenceObject = Get-Acl -LiteralPath $Source 
     PassThru   = $True 
    } 

    $CompParams.DifferenceObject = Get-Acl -LiteralPath $Target 

    $AccessParams = @{ 
     ReferenceObject = ($CompParams.ReferenceObject.sddl -split 'G:', 2 | Select -Last 1) 
     DifferenceObject = ($CompParams.DifferenceObject.sddl -split 'G:', 2 | Select -Last 1) 
     PassThru   = $True 
    } 

    if (Compare-Object @AccessParams) { 
     Write-Verbose 'Test-ACLequalHC: Not equal' 
     $false 
    } 
    else { 
     Write-Verbose 'Test-ACLequalHC: Equal' 
     $True 
    } 
} 

Test-ACLequal -Source $File1-Target $File2 

Vous pouvez voir clairement qu'il ya une différence entre les deux fichiers:

$AccessParams.ReferenceObject 
DUD:(A;ID;FA;;;BA)(A;ID;0x1200a9;;;S-1-5-21-1078081533-261478967-839522115-243052)(A;ID;0x1301ff;;;S-1 
-5-21-1078081533-261478967-839522115-280880)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115-6 
96733)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115-696745) 

$AccessParams.DifferenceObject 
DUD:AI(A;ID;FA;;;BA)(A;ID;0x1200a9;;;S-1-5-21-1078081533-261478967-839522115-243052)(A;ID;0x1301ff;;;S 
-1-5-21-1078081533-261478967-839522115-280880)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115 
-696733)(A;ID;0x1301ff;;;S-1-5-21-1078081533-261478967-839522115-696745) 

Est-il possible de comparer les fichiers en utilisant le SDDL sans courir dans ce problème?

Répondre

1

Est-ce que .Equals fonctionne pour vous ici?

$sourceAcl = Get-Acl $source 
$targetAcl = Get-Acl $target 

if ($sourceAcl.sddl.Equals($targetAcl.sddl)) { 
    # Do something 
    .... 
} 

Ceci inclut le propriétaire cependant. Dans votre exemple où vous le supprimez, vous convertissez également l'objet en une chaîne, l'utilisation de Compare-Object n'est donc pas vraiment nécessaire. Je ne suis pas sûr de la sécurité de la séparation que vous utilisez. Vous pouvez également faire:

$sourceAcl = Get-Acl $source 
$targetAcl = Get-Acl $target 
$s = $sourceAcl.sddl -replace "^O:[^:]+:","" 
$t = $targetAcl.sddl -replace "^O:[^:]+:","" 

if ($s -eq $t) { 
    # Do something 
    .... 
} 
+0

Je considérais utiliser ce '$ CompParams.ReferenceObject.sddl -split « \ (», 2 | Sélectionnez -Dernière 1' – DarkLite1

+0

En fait, en utilisant une scission n'est pas la bonne chose à J'ai du mettre à jour la réponse – arco444

+1

Modifier le sddl avant de le vérifier en général ne semble pas être une chose sensée à faire, il ne semble pas que ce soit destiné à être analysé avec un traitement de chaîne Il serait beaucoup plus sûr de laisser l'objet intact et de comparer avec la méthode '.Equals()' – arco444