Mindannyian számtalanszor hallottuk vagy olvastuk már, hogy a beállításokat, adatokat, naplófájlokat tartalmazó mappákat érdemes elmozgatni az alapértelmezett helyükről és célszerű áttenni őket másik partícióra. Ha a mappa létrehozása és az átirányítás beállítása után Access Denied hibaüzenetet kapunk, két lehetőségünk van: vagy kitaláljuk, hogy milyen ACL-eket kellene beállítani a mappára, vagy klónozzuk az egész hozzáférés szabályozási listát egy másik mappáról. Ez utóbbi sem megy mindig simán.
PowerShellből nagyon egyszerű egy fájl vagy mappa jogosultságainak lekérdezése, a Get-Acl commandlet pont erre szolgál:
PS C:\> Get-Acl C:\
Directory:
Path Owner Access
---- ----- ------
C:\ NT SERVICE\TrustedInstaller NT AUTHORITY\Authenticated Users All...
Ez így teljesen olvashatatlan, formázzuk meg egy kicsit a Format-List segítségével:
PS C:\> Get-Acl C:\ | Format-List
Path : Microsoft.PowerShell.Core\FileSystem::C:\
Owner : NT SERVICE\TrustedInstaller
Group : NT SERVICE\TrustedInstaller
Access : NT AUTHORITY\Authenticated Users Allow AppendData
NT AUTHORITY\Authenticated Users Allow -536805376
NT AUTHORITY\SYSTEM Allow FullControl
NT AUTHORITY\SYSTEM Allow 268435456
BUILTIN\Administrators Allow 268435456
BUILTIN\Administrators Allow FullControl
BUILTIN\Users Allow ReadAndExecute, Synchronize
Audit :
Sddl : O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-185
3292631-2271478464D:PAI(A;;LC;;;AU)(A;OICIIO;SDGXGWGR;;;AU)(A;;FA;;;SY)(A;OICIIO;GA;;;SY)(A;OICIIO;GA;;;BA)(A;
;FA;;;BA)(A;OICI;0x1200a9;;;BU)
Szerencsére a Get-Acl-nek van párja, a Set-Acl-t így kell paraméterezni:
SYNTAX
Set-Acl [-path] <string[]> [-aclObject] <ObjectSecurity> [-filter <string>] [-include <string[]>] [-exclude <string
[]>] [-passThru] [-whatIf] [-confirm] [<CommonParameters>]
A –path paraméter a cél mappa vagy registry kulcs útvonala, a beállítandó jogosultságokat pedig az –aclObject paraméterben kell megadni. Szerencsére a két utasítást össze is csövezhetjük:
Get-Acl W:\Forras | Set-Acl W:\Cel
Ez általában jól működik, a jogosultságok átmennek a forrás mappáról a cél mappára. Néha azonban a következő hibaüzenetet kapjuk:
PS C:\Windows\System32> Get-Acl C:\inetpub\wwwroot | Set-Acl W:\Cel
Set-Acl : The security identifier is not allowed to be the owner of this object.
At line:1 char:37
+ Get-Acl c:\inetpub\wwwroot | Set-Acl <<<< W:\Cel
Ennek pedig az az oka, hogy a forrás mappának olyan tulajdonosa van, akinek nem varrhatunk a nyakába egy mappát. Az NTFS alapszabály, miszerint tulajdonjogot csak elvenni lehet, másra ráruházni nem, természetesen itt is érvényes. A jó hír az, hogy PowerShellben .NET objektumokkal dolgozunk, így a Get-Acl eredménye is egy System.Security.AccessControl.DirectorySecurity példány, aminek vannak olyan metódusai, amelyek a mappa tulajdonosával kapcsolatosak. Aki nem hiszi, járjon utána:
PS C:\> Get-Acl C:\inetpub\wwwroot | Get-Member *Owner
TypeName: System.Security.AccessControl.DirectorySecurity
Name MemberType Definition
---- ---------- ----------
Owner CodeProperty System.String Owner{get=GetOwner;}
GetOwner Method System.Security.Principal.IdentityReference GetOwner(Type targetType)
SetOwner Method System.Void SetOwner(IdentityReference identity)
Faraghatunk tehát egy egyedi ACL-t, amiben felülírjuk a tulajdonost a SetOwner metódus segítségével és azt adhatjuk meg a célmappának, például így:
$owner = New-Object System.Security.Principal.NTAccount("TARTOMANY","felhasznalo")
$acl = Get-Acl C:\inetpub\wwwroot
$acl.SetOwner($owner)
Set-Acl -Path W:\Cel -AclObject $acl
A megoldás kulcsa, hogy az NTAccount az IdentityReference osztályból származik és hogy a saját felhasználónkat adjuk meg tulajdonosnak.