2017-12-04 3 views
0

Ich habe ein Powershell-Skript, das einige Dateien für die spätere Verwendung von einem Python-Skript kopiert. Die Kopieroperation ist diese:Kopieren von Dateien ohne Berechtigungen

ls $env:MINGW_32 -r -ea silentlycontinue -fo -inc "*.dll" | % { cp $_.fullname "build\lib.win32-2.7" } 

Nichts besonders interessant oder ungewöhnlich. Die interessante (frustrierend) Teil ist das, was später passiert:

error: [Error 5] Access is denied: 'build\\bdist.win32\\4758ccaeay32.dll' 

CPython hat in der Tat Logik in distutils, dass die Dateiberechtigungen, nachdem es kopiert die DLLs explizit zurücksetzt, genau dieses Problem zu vermeiden. Ich habe versucht, dies in Powershell zu replizieren, aber noch nicht erfolgreich gewesen:

$location = ".\build"; 
#Search recursivly through location defined; 
get-childitem -r $location | foreach{ 
    $tempLocation = $_.FullName; 
    #Get ACL for tempLocation; 
    $acl = get-acl $tempLocation; 
    #Get SID of explicit ACL; 
    $acl.Access | where{ 
      $_.isinherited -like $false} | foreach{ 
      #Foreach SID purge the SID from the ACL; 
      $acl.purgeaccessrules($_.IdentityReference); 
      #Reapply ACL to file or folder without SID; 
      Set-Acl -AclObject $acl -path $tempLocation; 
    } 
} 

Gibt es irgendwelche Vorschläge zurücksetzen oder vorzugsweise vermeiden in erster Linie der Dateiberechtigungen kopieren, so dass der Python-Skript nicht ausfällt?

Antwort

0

Versuchen Sie einen etwas anderen Ansatz. Anstatt die ACLs jeder Datei neu zu erstellen, erstellen Sie eine ACL und wenden Sie sie auf alle Dateien an. Ich glaube auch, dass Ihr Anruf zu .PurgeAccessRules(<IdentityReference>) statt Anrufe

$location = ".\build" 

#Get ACLs for first file in the folder 
$ACL = GCI $location -File | Select -First 1 | Get-Acl 
#Remove all non-inherited access rules, piped to Out-Null to avoid 'True' spam as it removes rules 
$ACL.Access | ?{!$_.IsInherited} | %{$ACL.RemoveAccessRule($_) | Out-Null} 

#Search recursivly through location defined; 
GCI -r $location | Set-Acl -AclObject $ACL 

Aliases verwendet (abgeschnitten Ergebnisse) zu .RemoveAccessRule(<AccessRule>) sein soll:

PS C:\Users\TMTech> Get-Alias GCI,? 
CommandType  Name            Version Source 
-----------  ----            ------- ------ 
Alias   GCI -> Get-ChildItem 
Alias   % -> ForEach-Object 
Alias   ? -> Where-Object 
+0

Beachten Sie, dass auch nach Anregungen und Änderungen in der Tat, um zu versuchen zu machen Das Skript noch robuster, ich lief immer noch in den Fehler. Ich werde das markieren, weil das wahrscheinlich in den meisten Szenarien zutrifft. – xaav

Verwandte Themen