Как с помощью 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,
Нужны ли мне права администратора домена для выполнения этой команды? Или может сам домен-пользователь может запустить эту команду?
Похоже, вы пытаетесь избежать установки модулей PowerShell на рабочие станции пользователей, да, но также, нет, вам не нужно быть администратором домена, чтобы искать свое имя в AD. Вы можете найти практически любую информацию, которая появляется в глобальном списке адресов в Outlook, включая полное имя, как обычный пользователь.
Вы также можете искать полные имена других людей как обычный пользователь в AD (используя Get-WmiObject Win32_userAccount
, если вы хотите избежать использования модулей AD). Учетные записи служб, которые запрашивают AD (ну, до управляемые сервисные аккаунты) обычно являются стандартными непривилегированными пользователями AD.
Если у вас всегда есть .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 не реализует.
Использование -match не является хорошим выбором, потому что $ env: USERNAME из «ed» будет соответствовать «fred» и «edith». Вместо этого используйте -eq для точного совпадения и при необходимости добавьте домен. Я использую цикл foreach в конце, чтобы убрать все начальные и завершающие пробелы, в качестве альтернативы «select fullname | ft -HideTableHeaders», который печатает начальную и конечную новую строку.
gwmi win32_useraccount | where {$_.caption -eq $("domain\" + $env:USERNAME)} | foreach {$_.fullname}
Если вы не хотите использовать модуль Active Directory, вы не можете; если вы не хотите пойти еще глубже и выполнить фактический запрос LDAP к контроллеру домена.
Любая информация о пользователе, кроме имени пользователя, хранится в Active Directory и должна быть там извлечена.
([adsi]"LDAP://$(whoami /fqdn)").displayName
Вы можете получить огромное количество информации, используя этот очень простой инструмент. Проверять, выписываться
([adsi]"LDAP://$(whoami /fqdn)") | fl *