Kezdjük talán a legegyszerűbbel, a WhoAmI paranccsal. Ez a parancs sok hasznos információt jelenít meg számunkra a felhasználói információinkkal kapcsolatban. Ha megnézzük a helpjét, akkor egy nagyon hasznos dolgot láthatunk benne, ami megkönnyíti a PowerShelles integrációt, ez pedig a CSV formátumú kimenet választásának lehetősége.
Ha jobban megvizsgáljuk, akkor alapvetően háromfajta információt gyűjt össze nekünk ez a segédprogram: a felhasználóval kapcsolatos információk, csoporttagság és privilégiumok. Ezek – ha objektumokban gondolkodunk – eltérő jellegzetességekkel, tulajdonságokkal rendelkező információk, így ezeket nem könnyű összevonni, érdemes ezeket külön kezelni.
Mindezek figyelembevételével az alábbi függvényt találtam ki megoldásként:
function get-whoami
{
param (
[Parameter(Position = 0)]
[string]
[ValidateScript({
"user" -like "$_*" -or
"groups" -like "$_*" -or
"privileges" -like "$_*" -or
"all" -like "$_*"
})]
$Type
)
$u = $g = $p = $null
if("user" -like "$type*" -or "all" -like "$type*"){
$u = whoami
-user /fo CSV | ConvertFrom-Csv
}
if("groups" -like "$type*" -or "all" -like "$type*"){
$g = whoami
-groups /fo CSV | ConvertFrom-Csv |
Select-Object
-Property "Group
Name", Type, SID,
@{n="Attributes"; e={,@($_.attributes -split ",
")}}
}
if("privileges" -like "$type*" -or "all" -like "$type*"){
$p = whoami
-priv /fo CSV | ConvertFrom-Csv
}
if("all" -notlike "$type*"){$u, $g, $p | %{$_}}
else{
New-Object
-TypeName PSObject -Property @{
User = $u
Groups = $g
Priv = $p
}
}
}
A függvénynek egy paramétere van, a $Type, ami a user, privileges, groups és all lehetőségek valamelyikére kell, hogy illeszkedjen, beleértve a semmit, azaz ha nem szerepeltetjük ezt a paramétert, akkor ez az all-al ekvivalens. Ezután attól függően, hogy mi a $Type értéke, a whoami megfelelő parancssori kapcsolóival meghívom, a CSV formátumú kimenetből objektum-gyűjteményt alakítok ki a ConvertFrom-CSV cmdlet segítségével.
A groups variációnál még szükséges egy kis átalakítás az Attributes tulajdonságnál, mert alaphelyzetben ez egy vesszővel felsorolt szöveg, ebből készítek a Select-Object segítségével igazi sztringtömböt.
Ha nem az all-ra illeszkedik a $Type, akkor a korábbiak közül azt a részeredményt teszem csak ki a kimenetre, amelyiknek van értéke. Ha pedig az all-ra illeszkedik a $Type, akkor pedig mindhárom részeredményből egy közös objektumot készítek, melynek az egyes tulajdonságai lesznek ezen részeredmények.
Így a kimenetem már teljesen PowerShell-szerű lesz, amelyet fel tudunk használni PowerShell szkriptjeinkben.
Nézzük, milyen kimenetet produkál ez a függvény:
[1] PS C:\> get-whoami -Type u
User Name SID
--------- ---
soost-pc\soost S-1-5-21-1879730660-3170798090-27083...
[2] PS C:\> get-whoami -Type g
Group Name Type SID Attributes
---------- ---- --- ----------
Everyone Well-known group S-1-1-0 {Mandatory group...
soost-PC\Dummy Alias S-1-5-21-1879730... {Mandatory group...
soost-PC\HomeUsers Alias S-1-5-21-1879730... {Mandatory group...
BUILTIN\Administ... Alias S-1-5-32-544 {Group used for ...
BUILTIN\Users Alias S-1-5-32-545 {Mandatory group...
NT AUTHORITY\INT... Well-known group S-1-5-4 {Mandatory group...
CONSOLE LOGON Well-known group S-1-2-1 {Mandatory group...
NT AUTHORITY\Aut... Well-known group S-1-5-11 {Mandatory group...
NT AUTHORITY\Thi... Well-known group S-1-5-15 {Mandatory group...
LOCAL Well-known group S-1-2-0 {Mandatory group...
NT AUTHORITY\NTL... Well-known group S-1-5-64-10 {Mandatory group...
Mandatory Label\... Label S-1-16-8192 {Mandatory group...
[3] PS C:\> get-whoami -Type p
Privilege Name Description State
-------------- ----------- -----
SeShutdownPrivilege Shut down the system Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeUndockPrivilege Remove computer from do... Disabled
SeIncreaseWorkingSetPri... Increase a process work... Disabled
SeTimeZonePrivilege Change the time zone Disabled
[4] PS C:\> get-whoami | fl
Groups : {@{Group Name=Everyone; Type=Well-known group; SID=S-1-1-0; Attributes
=System.Object[]}, @{Group Name=soost-PC\Dummy; Type=Alias; SID=S-1-5-
21-1879730660-3170798090-2708336039-1002; Attributes=System.Object[]},
@{Group Name=soost-PC\HomeUsers; Type=Alias; SID=S-1-5-21-1879730660-
3170798090-2708336039-1003; Attributes=System.Object[]}, @{Group Name=
BUILTIN\Administrators; Type=Alias; SID=S-1-5-32-544; Attributes=Syste
m.Object[]}...}
User : @{User Name=soost-pc\soost; SID=S-1-5-21-1879730660-3170798090-2708336
039-1000}
Priv : {@{Privilege Name=SeShutdownPrivilege; Description=Shut down the syste
m; State=Enabled}, @{Privilege Name=SeChangeNotifyPrivilege; Descripti
on=Bypass traverse checking; State=Enabled}, @{Privilege Name=SeUndock
Privilege; Description=Remove computer from docking station; State=Dis
abled}, @{Privilege Name=SeIncreaseWorkingSetPrivilege; Description=In
crease a process working set; State=Disabled}...}
Természetesen ezt még tovább tudnánk szépíteni, ha egyedi típusneveket adnánk a kimeneti objektumoknak és ezekhez szép format.ps1xml kifejezéseket rendelnénk.