W programie PowerShell w jaki sposób mogę uzyskać pełną nazwę aktualnie zalogowanego użytkownika domeny (nie tylko jego nazwę użytkownika) bez potrzeby korzystania z modułu ActiveDirectory?
W programie PowerShell w jaki sposób mogę uzyskać pełną nazwę aktualnie zalogowanego użytkownika domeny (nie tylko jego nazwę użytkownika) bez potrzeby korzystania z modułu ActiveDirectory?
Odpowiedzi:
$dom = $env:userdomain
$usr = $env:username
([adsi]"WinNT://$dom/$usr,user").fullname
Zwroty:
John Doe
Dostępne są także inne (głównie) niejasne właściwości. Kilka przydatnych:
Próbować:
[adsi]"WinNT://$dom/$usr,user" | select *
Podoba mi się zaakceptowana odpowiedź, ale tylko dlatego, że sam chciałem to wypróbować:
$user = whoami
Get-WMIObject Win32_UserAccount | where caption -eq $user | select FullName
zwraca:
FullName
--------
TheCleaner
lub jeśli nie chcesz mieć informacji o nagłówku i tylko wynik:
$user = whoami
Get-WMIObject Win32_UserAccount | where caption -eq $user | select FullName | ft -hide
Jedna linijka za pomocą Powershell 3.0:
gwmi win32_useraccount | where {$_.caption -match $env:USERNAME} | select fullname | ft -HideTableHeaders
W oparciu o komentarz do zaakceptowanej odpowiedzi Craig620,
Czy potrzebuję uprawnień administratora domeny, aby uruchomić to polecenie? Czy może sam użytkownik domeny może uruchomić to polecenie?
Wygląda na to, że próbujesz uniknąć instalowania modułów PowerShell na stacjach roboczych użytkowników, tak, ale także nie, nie musisz być administratorem domeny, aby wyszukać swoją nazwę w AD. Możesz wyszukać praktycznie dowolne informacje wyświetlane w GAL w Outlooku, w tym pełną nazwę, jako standardowy użytkownik.
Możesz także wyszukać imiona i nazwiska innych osób jako standardowego użytkownika w AD (używając Get-WmiObject Win32_userAccount
, jeśli chcesz uniknąć modułów AD). Konta usługowe, które odpytują AD (cóż, przed zarządzanymi kontami usługowymi ) są zwykle standardowymi, nieuprzywilejowanymi użytkownikami AD.
Użycie -match nie jest dobrym wyborem, ponieważ $ env: USERNAME dla „ed” będzie pasować do „fred” i „edith”. Zamiast tego użyj -eq dla dokładnego dopasowania i dodaj w domenie, jeśli to konieczne. Używam pętli foreach na końcu, aby usunąć wszystkie wiodące końcowe białe znaki jako alternatywę dla „wybierz pełną nazwę | ft -HideTableHeaders”, która drukuje wiodącą i końcową nową linię.
gwmi win32_useraccount | where {$_.caption -eq $("domain\" + $env:USERNAME)} | foreach {$_.fullname}
Jeśli zawsze masz .Net 3.5 lub nowszą wersję (którą powinieneś mieć z PowerShell v4.0 i wyższą wersją):
Add-Type -AssemblyName System.DirectoryServices.AccountManagement;
$DisplayName = [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.DisplayName;
Ta klasa zapewnia bardzo łatwy dostęp do wszystkich wspólnych właściwości LDAP, więc nie trzeba wyszukiwać dwa razy (raz w WinNT i ponownie w LDAP) lub użyć [ADSISearcher]
wyszukiwania LDAP, jeśli chcesz mieć rozszerzone właściwości, których WinNT nie implementuje .
Jeśli nie chcesz korzystać z modułu Active Directory, nie możesz; chyba że chcesz zejść jeszcze głębiej i wykonać rzeczywiste zapytanie LDAP na kontrolerze domeny.
Wszelkie informacje o użytkownikach inne niż nazwa użytkownika są przechowywane w usłudze Active Directory i należy je tam pobrać.
[ADSI]
interfejs działał znacznie dłużej niż moduły AD i naprawdę nie jest wcale taki skomplikowany, jak pokazuje zaakceptowana odpowiedź.