Використовуючи PowerShell, як я можу отримати поточний вхід на повне ім’я користувача домену (не лише його ім’я користувача) без необхідності модуля ActiveDirectory?
Використовуючи PowerShell, як я можу отримати поточний вхід на повне ім’я користувача домену (не лише його ім’я користувача) без необхідності модуля ActiveDirectory?
Відповіді:
$dom = $env:userdomain
$usr = $env:username
([adsi]"WinNT://$dom/$usr,user").fullname
Повернення:
John Doe
Також доступні деякі інші (переважно) незрозумілі властивості. Кілька корисних:
Спробуйте:
[adsi]"WinNT://$dom/$usr,user" | select *
Мені подобається прийнята відповідь, але тільки тому, що я хотів це спробувати сам:
$user = whoami
Get-WMIObject Win32_UserAccount | where caption -eq $user | select FullName
повертає:
FullName
--------
TheCleaner
або якщо ви хочете не мати інформацію про заголовок, а лише результат:
$user = whoami
Get-WMIObject Win32_UserAccount | where caption -eq $user | select FullName | ft -hide
Один вкладиш, що використовує Powershell 3.0:
gwmi win32_useraccount | where {$_.caption -match $env:USERNAME} | select fullname | ft -HideTableHeaders
На основі Вашого коментаря до прийнятої відповіді Craig620,
Чи потрібні права адміністратора домену для запуску цієї команди? Чи може сам користувач домену виконати цю команду?
Схоже, ви намагаєтеся уникати встановлення модулів shellhell на робочих станціях користувача, так, але також, ні, вам не потрібно бути адміністратором домену, щоб шукати власне ім’я в AD. Ви можете шукати майже будь-яку інформацію, яка з’являється в GAL в Outlook, включаючи повне ім’я, як звичайний користувач.
Ви також можете шукати повні імена інших людей як стандартного користувача в AD (використовуючи Get-WmiObject Win32_userAccount
, якщо ви хочете уникати модулів AD). Облікові записи сервісів, які запитують AD (ну і до керованих облікових записів послуг ), як правило, є стандартними, непривілейованими користувачами AD.
Використання -match не є гарним вибором, оскільки $ env: USERNAME з "ed" буде відповідати "fred" та "edith". Замість цього використовуйте -eq для точної відповідності та додайте домен, якщо потрібно. Я використовую цикл foreach в кінці, щоб викреслити всі провідні проміжні пробіли як альтернативу "select fullname | ft -HideTableHeaders", який друкує провідний і кінцевий новий рядок.
gwmi win32_useraccount | where {$_.caption -eq $("domain\" + $env:USERNAME)} | foreach {$_.fullname}
Якщо у вас завжди .Net 3.5 або новішої версії (що вам слід з PowerShell v4.0 і вище):
Add-Type -AssemblyName System.DirectoryServices.AccountManagement;
$DisplayName = [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.DisplayName;
Цей клас забезпечує дуже простий доступ до всіх загальних властивостей LDAP, тому вам не потрібно шукати двічі (один раз з WinNT і знову з LDAP) або використовувати [ADSISearcher]
для пошуку LDAP, якщо ви хочете отримати деякі розширені властивості, які WinNT не реалізує .
Якщо ви не хочете використовувати модуль Active Directory, ви не можете; якщо ви не хочете заглибитись і виконати фактичний LDAP-запит проти контролера домену.
Будь-яка інформація про користувача, окрім імені користувача, зберігається в Active Directory, і її потрібно отримати там.
[ADSI]
інтерфейс значно довший, ніж модулі AD, і насправді не все так складно, як показує прийнята відповідь.