Usando o PowerShell, como posso obter o nome completo do usuário do domínio atualmente conectado (não apenas o nome de usuário) sem a necessidade do módulo ActiveDirectory?
Usando o PowerShell, como posso obter o nome completo do usuário do domínio atualmente conectado (não apenas o nome de usuário) sem a necessidade do módulo ActiveDirectory?
Respostas:
$dom = $env:userdomain
$usr = $env:username
([adsi]"WinNT://$dom/$usr,user").fullname
Devoluções:
John Doe
Algumas outras propriedades (principalmente) obscuras também estão disponíveis. Alguns úteis:
Experimentar:
[adsi]"WinNT://$dom/$usr,user" | select *
Eu gosto da resposta aceita, mas só porque eu queria tentar isso sozinho:
$user = whoami
Get-WMIObject Win32_UserAccount | where caption -eq $user | select FullName
retorna:
FullName
--------
TheCleaner
ou se você deseja não ter as informações do cabeçalho e apenas o resultado:
$user = whoami
Get-WMIObject Win32_UserAccount | where caption -eq $user | select FullName | ft -hide
Um revestimento usando o Powershell 3.0:
gwmi win32_useraccount | where {$_.caption -match $env:USERNAME} | select fullname | ft -HideTableHeaders
Com base no seu comentário na resposta aceita de Craig620,
Preciso de direitos de administrador de domínio para executar este comando? Ou o próprio usuário do domínio pode executar este comando?
Parece que você está tentando evitar a instalação de módulos do PowerShell nas estações de trabalho dos usuários. Sim, mas também não, você não precisa ser um administrador de domínio para procurar seu próprio nome no AD. Você pode procurar praticamente todas as informações que aparecem na GAL no Outlook, incluindo o nome completo, como usuário padrão.
Você também pode procurar os nomes completos de outras pessoas como um usuário padrão no AD (usando Get-WmiObject Win32_userAccount
, se desejar evitar os módulos do AD). As contas de serviço que consultam o AD (bem, antes das contas de serviço gerenciadas ) geralmente são usuários padrão e sem privilégios do AD.
Usar -match não é uma boa opção, porque um $ env: USERNAME de "ed" corresponderá a "fred" e "edith". Em vez disso, use -eq para obter uma correspondência exata e adicione o domínio, se necessário. Eu uso um loop foreach no final para remover todos os espaços em branco à esquerda como alternativa para "selecionar nome completo | ft -HideTableHeaders", que imprime uma nova linha à esquerda e à direita.
gwmi win32_useraccount | where {$_.caption -eq $("domain\" + $env:USERNAME)} | foreach {$_.fullname}
Se você sempre possui o .Net 3.5 ou superior (o que deveria com o PowerShell v4.0 e superior):
Add-Type -AssemblyName System.DirectoryServices.AccountManagement;
$DisplayName = [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.DisplayName;
Essa classe fornece acesso muito fácil a todas as propriedades LDAP comuns, portanto, você não precisa procurar duas vezes (uma vez com o WinNT e novamente com LDAP) ou usar [ADSISearcher]
para fazer uma pesquisa LDAP se desejar algumas propriedades estendidas que o WinNT não implementa .
Se você não quiser usar o módulo do Active Directory, não poderá; a menos que você queira ir ainda mais fundo e executar uma consulta LDAP real em um controlador de domínio.
Qualquer informação de usuário que não seja o nome de usuário é armazenada no Active Directory e precisa ser recuperada lá.
[ADSI]
interface existe há muito mais tempo que os módulos do AD, e realmente não é tão complicado, como mostra a resposta aceita.