2011-07-08 21 views
28

Chciałbym zmienić listę ACL na dysku C:. Co ja próbuję zrobić, to usunąć uprawnienia, które użytkownik może utworzyć folder bezpośrednio na dysku. Testowałem skrypt w innym folderze podczas jego zapisywania. Działało bez problemu. Po zakończeniu wypróbowałem skrypt w naszym zestawie testowym na rzeczywistym napędzie. Dostaję błąd, którego nie mogę zrozumieć. Jeśli usuniemy uprawnienia ręcznie, działa bez problemu. Czy ktoś ma pomysł?Dlaczego Set-Acl na dysku głównym próbuje ustawić własność "obiektu"?

$path = "C:\" 

$colRights = [System.Security.AccessControl.FileSystemRights]"CreateDirectories" 

$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 

$objType =[System.Security.AccessControl.AccessControlType]::Allow 
$objUser = New-Object System.Security.Principal.NTAccount("Authenticated Users") 
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 

$objACL = Get-ACL $path 
$objACL.RemoveAccessRule($objACE) 

Set-ACL $path $objACL 

Błąd jest:

Set-Acl : The security identifier is not allowed to be the owner of this object. 
At C:\Users\mhodler\Desktop\Remove Permission.ps1:57 char:8 
+ Set-ACL <<<< $path $objACL 
    + CategoryInfo   : InvalidOperation: (C:\:String) [Set-Acl], InvalidOperationException 
+ FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.SetAclCommand 
+0

Znaleziono odpowiedź. Przepraszamy za opublikowanie tutaj. Nie mam pozwolenia, aby opublikować odpowiedź na moje własne pytanie w ciągu najbliższych 4 godzin. Wymień $ objACL = Get-ACL $ path Z $ objACL = (get-item $ path) .getaccesscontrol ("Dostęp") –

Odpowiedz

55

znalazłem odpowiedź. Microsoft twierdzi

Unfortunately Get-Acl is missing some features. It always reads the full security descriptor even if you just want to modify the DACL. That’s why Set-ACL also wants to write the owner even if you have not changed it. Using the GetAccessControl method allows you to specify what part of the security descriptor you want to read.

Wymienić połączenia Get-Acl z

$acl = (Get-Item $path).GetAccessControl('Access') 
8

Musisz SeRestorePrivilege ustawić właściciela. Użyłem skryptu Lee Holmesa z poniższego adresu URL, aby podnieść mój proces z tym dodatkowym priv i mogłem ustawić właściciela na kogoś innego niż ja.

http://www.leeholmes.com/blog/2010/09/24/adjusting-token-privileges-in-powershell/

Próbowałem metody (get-item $path).getaccesscontrol("access") ale wciąż mam ten sam błąd, ponieważ mój proces nie miał SeRestorePrivilege.

+1

Wielkie dzięki za to. Znaleziono przez Google i pomógł mi rozwiązać zupełnie inny problem. –

+1

Dziękuję, to było dla mnie najważniejsze. Odkryłem również, że możliwym obejściem ustawienia właściciela jest użycie wersji ścieżki "lokalny UNC", np. jeśli chcesz ustawić właściciela dla C: \ test.txt, musisz wywołać metodę SetAccessControl na elemencie (get-item "\\ localhost \ C $ \ test.txt"). –

+0

Chociaż to działa, preferuję wybrane rozwiązanie o raczej użyciu (Get-Item $ path) .GetAccessControl ("Access"), aby uzyskać obiekt ACL – bergmeister

1

Poniższy kod działa dla mnie:

$ApplicationPoolIdentity = "everyone" 

function SetACL() 
{ 
    param (
     [Parameter(Mandatory=$true)] 
     [string]  $Path 
    ) 

    $Acl = (Get-Item $Path).GetAccessControl('Access') 
    Write-Host "Path:" $Path "ID:" $ApplicationPoolIdentity 
    $Ar = New-Object system.security.accesscontrol.filesystemaccessrule($ApplicationPoolIdentity,"Write","Allow") 
    $Acl.SetAccessRule($Ar) 
    Write-Host $Acl 
    $Acl | Set-Acl $Path 
} 

SetACL "C:\Test\" 
0

$ Acl = (Get-Item $ Path) .GetAccessControl ('Dostęp')

pracował dla mnie. Uruchamiam mój skrypt PS z CMD iw tym PS Script uruchamiam inny PS Script wszystko działa dobrze, dopóki robię to z moim własnym Użytkownikiem. Gdy używam innego użytkownika, pojawia się ten sam błąd: Set-Acl: Identyfikator zabezpieczeń nie może być właścicielem tego obiektu.

Po prostu zmieniono Get-ACL na tę Linię powyżej i działało dobrze. Jeszcze raz dziękuję.

Powiązane problemy