Miesięcznik informatyków i menedżerów IT sektora publicznego

Bartosz Bielawski

Jak wykonać kopię folderu domowego

W każdej organizacji występuje rotacja personelu. W codziennej pracy przydatna okaże się automatyzacja działań związanych z porządkowaniem zasobów IT wykorzystywanych przez odchodzącego pracownika.

Gdy pracownik odchodzi z urzędu na ogół archiwizowane są dane użytkownika, w tym m.in. jego folder domowy.

Na początek trzeba zdefiniować kilka założeń dotyczących skryptu. Przede wszystkim zakładamy, że informacja o folderze domowym użytkownika przechowywana jest w Active Directory i wykorzystywany jest do tego celu atrybut homeDirectory. Po drugie, na serwerze, na którym uruchamiany będzie skrypt, dostępna jest wersja oprogramowania 7zip, która nie potrzebuje do działania żadnych zewnętrznych bibliotek (7za.exe). I to niezależnie od tego, czy aplikacja znajduje się w folderze, który jest określony w zmiennej PATH, czy też w tym samym miejscu co nasz skrypt. Wspomniane rozwiązanie to oczywiście jeden z wielu sposobów kompresowania danych z poziomu PowerShella. Możemy też skorzystać z innych aplikacji, w tym z dodanej niedawno do platformy .NET biblioteki System.IO.Compression.FileSystem czy polecenia Write-Zip dostępnego w PowerShell Community Extensions. Użycie 7zip minimalizuje jednak liczbę zależności i pozostawia nam pewną elastyczność działania.

Na początku naszego skryptu musimy upewnić się, że wymagana aplikacja jest dostępna:

if ($cmd = Get-Command 7za.exe -ErrorAction SilentlyContinue) {

New-Alias -Name zip -Value $cmd.Definition

} elseif ($cmd = Get-Command $ScriptPath\7za.exe) {

New-Alias -Name zip -Value $cmd.Definition

} else {

Write-Error '7-zip (7za.exe) nie odnaleziony'

exit 1

}

Kolejna sprawa to kwestia uprawnień. Aby móc swobodnie odczytywać dowolne pliki znajdujące się w folderze domowym użytkownika, możemy być zmuszeni najpierw przejąć je na własność, a następnie nadać obecnemu kontu odpowiednie prawa. Niestety, domyślnie PowerShell uruchamiany jest w trybie pozbawionym odpowiednich przywilejów:

whoami /priv /fo csv | ConvertFrom-Csv |

Where-Object { $_.'Privilege Name' -match 'Owner'}

Aby te uprawnienia włączyć, należy użyć bibliotek Win32 i sięgnąć do P/Invoke – sposobu opakowywania niskopoziomowych bibliotek w metody dostępne z poziomu języków .NET (takich jak C#). W PowerShellu możemy skorzystać z polecenia Add-Type:

if (-not ('AdjPriv' -as [type])) {

$definition = @'

using System;

using System.Runtime.InteropServices;

public class AdjPriv

{

[DllImport("advapi32.dll", ExactSpelling = true, `

SetLastError = true)]

internal static extern bool AdjustTokenPrivileges(IntPtr `

htok, bool disall,

ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

// ... kod P/Invoke definiujący prywatne metody i wczytujący

// niezbędne biblioteki

public static bool EnablePrivilege(long processHandle, `

string privilege, bool disable)

{

bool retVal;

TokPriv1Luid tp;

IntPtr hproc = new IntPtr(processHandle);

IntPtr htok = IntPtr.Zero;

retVal = OpenProcessToken(hproc, `

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);

tp.Count = 1;

tp.Luid = 0;

if(disable)

{

tp.Attr = SE_PRIVILEGE_DISABLED;

}

else

{

tp.Attr = SE_PRIVILEGE_ENABLED;

}

retVal = LookupPrivilegeValue(null, privilege, `

ref tp.Luid);

retVal = AdjustTokenPrivileges(htok, false, ref tp, `

0, IntPtr.Zero, IntPtr.Zero);

return retVal;

}

}

'@

Add-Type -TypeDefinition $definition

}

if ([AdjPriv]::EnablePrivilege(

(Get-Process -Id $PID).Handle,

'SeTakeOwnershipPrivilege',

$Disable

)) {

# Kod zmieniający własciciela }

Po wykonaniu powyższego kodu w bieżącym procesie ($PID) uzyskamy dostęp do przejmowania na własność plików i folderów (SeTakeOwnershipPrivilege). Całość obudujemy funkcją, która zadba o to, aby zmienić bieżącego właściciela. Żeby uniknąć komplikacji, usuwamy wcześniej zdefiniowane uprawnienia na obiektach, jednocześnie dodając pełne uprawnienia do konta, które uruchomiło nasz skrypt (w tym dla wszystkich obiektów znajdujących się w folderze domowym):

[...]

Autor zawodowo zajmuje się informatyką. Jest Microsoft MVP w dziedzinie PowerShella, blogerem oraz jednym z moderatorów forum dotyczącego skryptów w serwisie TechNet. Autor książki „Windows PowerShell 5.1 Biblia”.

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma. Zapraszamy do składania zamówień na prenumeratę i numery archiwalne.
 
 

Polecamy

Biblioteka Informacja Publiczna

Specjalistyczne publikacje książkowe dla pracowników administracji publicznej

więcej