Jak ziskat jmeno uctu nebo skupiny ze SIDu?

Tridy NTAccount a SecurityIdentifier v .NETu 2.0 umoznuji pohodlne pracovat s uzivatelskymi ucty, skupinami a jejich SIDy. Obe tridy implementuji metodu Translate, ktera vyvori ze SecurityIdentifieru NTAccount a naopak.

Ukazeme si jak muze vypadat jejich pouziti. Nejprve vyjdeme z objektu WindowsIdentity, ktery predstavuje prihlaseneho uzivatele (Win32 security token). Ten ziskame statickou metodou GetCurrent():

$me = [Security.Principal.WindowsIdentity]::GetCurrent()

S timto objektem se uz daji delat zajimave veci. Jako prvni zjistime, ktery uzivatelsky ucet predstavuje. (Pokud by nas zajimalo jenom jmeno konkretni prihlasene WindowsIdentity, mohli bychom pouzit vlastnost WindowsIdentity.Name. Ale my chceme zjistovat jmena i cizich uctu) K tomu slouzi vlastnost User ktera vraci objekt typu SecurityIdentifier:

PS C:\> $me.User | fl

BinaryLength     : 28
AccountDomainSid : S-1-5-21-1721254763-462695806-1538882281
Value            : S-1-5-21-1721254763-462695806-1538882281-2421664

PS C:\> $me.User.GetType().FullName
System.Security.Principal.SecurityIdentifier
PS C:\>

Pomoci metody Translate ziskame ze SIDu odpovidajici NTAccount, ktery nam rekne jmeno uctu. Protoze objekt predstavujici tridu NTAccount budeme jeste za chvili potrebovat, ulozime si ho do promenne. Tato syntaxe, kdy je jmeno tridy v hranatych zavorkach pouzito jako samostatny vyraz, je ekvivalentni s C#ovym typeof(System.Security.Principal.NTAccount).

PS C:\> $NTAccount = [Security.Principal.NTAccount]
PS C:\> $me.User.Translate($NTAccount) | fl *

Value : EUROPE\jachymko

WindowsIdentity obsahuje krome hlavniho uzivatelskeho uctu i clenstvi ve skupinach. To muzou byt budto bezne Windowsi skupiny, nebo specialni skupiny jako treba LOCAL nebo INTERACTIVE, ktere predstavuji zpusob jakym byla dana WindowsIdentity vytvorena (jak se prihlasila). Vlastnost Groups opet vraci objekty typu SecurityIdentifier, takze pokud chceme znat jejich privetiva jmena, musime opet pouzit metodu translate. V tomto pripade vyuzijeme cmdlet Select-Object, ktery umoznuje snadno vytvaret nove objekty. Pokud misto nazvu vlastnosti zadate hashtable, ktera obsahuje klice N(ame) a E(xpression), vracene objekty budou obsahovat nove vytvorenou vlastnost s danym jmenem a spocitanou hodntou.

PS C:\> $me.Groups | sort BinaryLength | select Value, @{ N='Name'; E={ $_.Translate($NTAccount).Value } } | ft -a

Value                                             Name
-----                                             ----
S-1-2-0                                           LOCAL
S-1-5-4                                           NT AUTHORITY\INTERACTIVE
S-1-5-15                                          NT AUTHORITY\This Organization
S-1-5-11                                          NT AUTHORITY\Authenticated Users
S-1-1-0                                           Everyone
S-1-5-32-545                                      BUILTIN\Users
S-1-5-21-2127521184-1604012920-1887927527-572185  REDMOND\RAS_smartcard
S-1-5-21-2127521184-1604012920-1887927527-2115484 REDMOND\SQMUsers_CORP
S-1-5-21-1721254763-462695806-1538882281-4264     EUROPE\First Tier Domain Users
S-1-5-21-1721254763-462695806-1538882281-513      EUROPE\Domain Users
S-1-5-21-3410745329-1839241643-327782414-1000     MIJAVM\Debugger Users
S-1-5-21-1721254763-462695806-1538882281-2660054  EUROPE\Europe_ras_smartcard4
S-1-5-21-2127521184-1604012920-1887927527-1421044 REDMOND\Corp Users
S-1-5-21-2127521184-1604012920-1887927527-150552  REDMOND\prague

Vsechny predchozi priklady predpokladaly ze mame prihlasenou WindowsIdentity. Ale my muzeme mit treba jen jmeno nejakeho uctu, a chceme zjistit jeho SID. Neni nic snazsiho nez ze jmena uctu vytvorit NTAccount a z nej SecurityIdentifier. PowerShell ma oproti statickym jazykum zbudovane mnohem bohatsi castovani. Pokud trida ma TypeConverter, konstruktor ktery bere string, atd., tak PowerShell toho vyuzije. Existuji tri zpusoby jak lze castovat: budto explicitne cast pres hranate zavorky ve vyrazu:

PS C:\> $dbl = [double]"42.123456"
PS C:\> $dbl
42,123456

Nebo muzete typ napsat na levou stranu prirazovaciho vyrazu, cimz vytvorite strongly typed promennou. Vse co do ni priradite se bude automaticky konvertovat na jeji typ, pokud to bude mozne:

PS C:\> [double]$dbl = "84.2468"
PS C:\> $dbl
84,2468
PS C:\> $dbl = 'not-a-double'
Cannot convert value "not-a-double" to type "System.Double". Error: "Input string was not in a correct format."
At line:1 char:5
+ $dbl <<<<  = 'not-a-double'
PS C:\>

A poslednim zpusobem je operator -as. Ten se od predchozich zpusobu lisi jednak tim, ze vlevo je hodnota co se bude konvertovat a vpravo je cilovy typ, a druhak tim ze typ muze byt zadan za behu. Oba dva predchozi casty byly "natvrdo", v kodu skriptu je napsany dany type-literal, a na nej se vse prevede. S operatorem -as na prave strane klidne muze byt promenna, vyraz, nebo cokoliv. Muzete se zeptat uzivatele na co se ma hodnota prevest, a pokud takovy typ existuje, tak se tak stane. My to tady vyuzijeme, protoze uz mame ulozenou instanci predstavujici typ NTAccount, kterou jsme pouzivali s metodou Translate. Ted ji pouzijeme s built-in castovanim. Samozrejme, nic nam nebrani pouzit New-Object a explicitne zavolat konstruktor, ale toto je kratsi, zajimavejsi a mnohem vice l33t :-)

PS C:\> ('EUROPE\czmossvc' -as $NTAccount).Translate([Security.Principal.SecurityIdentifier]) | fl *


BinaryLength     : 28
AccountDomainSid : S-1-5-21-1721254763-462695806-1538882281
Value            : S-1-5-21-1721254763-462695806-1538882281-2803188
Zveřejněno 16 listopadu 07 02:45 by jachymko

Komentář

# VasekB said on listopadu 16, 2007 23:03:

chyba.. funguje to kdyz zmenim jmeno promene "NTAccount"

# $NTAccount = [Security.Principal.NTAccount]

Cannot overwrite variable NTAccount because it is read-only or constant.

At line:1 char:11

+ $NTAccount  <<<< = [Security.Principal.NTAccount]

# hubka.net said on listopadu 17, 2007 8:29:

skvele riesenie vidim ze sa zacinaju lôudia viac venovat PS ... inak okrem PS je na to aj jedna CMD utilitka SID2User

# jachymko said on listopadu 17, 2007 11:57:

VasekB: nojo, chyba, PSCX definuje $NTAccount... jdu to opravit, diky!

# jitka said on dubna 1, 2008 19:27:

no to jsem zvedava

# jan said on dubna 1, 2008 19:27:

tak sup

# lo0m said on dubna 14, 2008 9:38:

dobry reseni !

# neřeknu said on listopadu 10, 2008 19:38:

nic moc ale deto

Neregistrovaní uživatele nemužou přidávat komentáře.
Vyvojar.cz na prodej!