Mappa jogosultságok klónozása

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.



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2008.10.27. 10:35:29 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • Linkblog: .NET 3.5 és Visual Studio 2008 momentum

    Balássy György (MS RD, ASP.NET MVP, MCTS) Bizonyára már mindenkihez eljutott a hír, hogy "elkészült a nagy mű, igen", megjelent a .NET Framework 3.5 és a Visual Studio 2008 verziója. Az első levél erről hétfő délelőtt 11-kor jött a Regional Directors levelezőlistára, fél órával később már le is halt az MSDN - gondolom mindenki rávetette magát a letöltésre. A hibaüzenetek között volt sokat - talán túlságosan is sokat - mondó. Tovább »
  • Web Konferencia 2008

    Balássy György (MS RD, ASP.NET MVP, MCTS) A hétvégén került megrendezésre a Web Konferencia 2008, melyen számos remek előadás mellett Bátorfi Zsolt barátom a Silverlightról, jómagam pedig az ASP.NET 3.5-ről és a Visual Studio 2008-ról beszéltem. A résztvevőknek megígértem, hogy közzéteszem az előadáshoz tartozó prezentációt és a bemutatott alkalmazás forráskódját is, íme. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások