Windows PowerShellで現在のユーザー名を取得する方法を教えてください。
見つけた:
$env:UserName
もあります:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:username
が最も簡単な方法です
与えられた答えをまとめて比較することは価値があると思いました。
(より簡単/短く/思い出に残るオプション)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(より信頼できるオプション)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(PowerShellインスタンスを実行しているユーザーの名前ではなく)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn on この他のフォーラム@Mark Seemannの回答に対する@Kevin Pankoのコメントは、他のカテゴリよりもカテゴリを選択することを目的としています。
$ env:USERNAMEはユーザーによって変更される可能性があるため、[Windowsアクセストークンによるアプローチ]が最も安全な方法です。ただし、これではだまされません。
つまり、環境変数オプションはより簡潔で、Windowsアクセストークンオプションはより信頼性があります。
偽装を使用してC#アプリケーションから実行していたPowerShellスクリプトでは、@ Mark SeemannのWindowsアクセストークンを使用する必要がありました。
C#アプリケーションは私のユーザーアカウントで実行され、サービスアカウントとしてPowerShellスクリプトを実行します。 C#からPowerShellスクリプトを実行する方法には制限があるため、PowerShellインスタンスはサービスアカウントユーザーとして実行されていても、ユーザーアカウントの環境変数を使用します。
このセットアップでは、環境変数optionsは私のアカウント名を返し、Windows access tokenオプションはサービスアカウント名(これは私が望んでいたものです)を返し、ログインユーザーオプションは私のアカウント名を返します。
また、自分でオプションを比較したい場合は、別のユーザーとしてスクリプトを実行するために使用できるスクリプトがあります。 Get-Credentialコマンドレットを使用して資格情報オブジェクトを取得し、このスクリプトを別のユーザーとして引数1として実行し、資格情報オブジェクトを引数2として実行する必要があります。
使用法:
$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred
Run-AsUser.ps1スクリプトの内容:
param(
[Parameter(Mandatory=$true)]
[string]$script,
[Parameter(Mandatory=$true)]
[System.Management.Automation.PsCredential]$cred
)
Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList 'noprofile','-Command',"$script"
whoami コマンドを投入したいのですが、これは基本的に他の回答で提案されているように%USERDOMAIN%\%USERNAME%
を実行するためのNiceの別名です。
Write-Host "current user:"
Write-Host $(whoami)
[Environment]::UserName
はユーザー名だけを返します。例えば。 bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
は、必要に応じてドメインを先頭に付けたユーザー名を返します。例えば。 SOMEWHERENICE\bob
ここで他人の仕事の上に構築するだけです:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
私は過去に$env:username
を使っていましたが、同僚はそれが環境変数でありユーザーによって変更される可能性があることを指摘しました。
私はMark Seemannの答えを支持します:[System.Security.Principal.WindowsIdentity] :: GetCurrent()。Name
しかし、私は許可されていません。 Markの答えでは、ユーザー名だけが必要な場合は、解析する必要があります。これは、私のシステムではhostname\username
を返し、ドメインアカウントを持つドメインに参加しているコンピュータではdomain\username
を返すためです。
whoami.exe
はWindowsのすべてのバージョンに存在するわけではないので、私は使用しません。それは別のバイナリへの呼び出しであり、一部のセキュリティチームに適している可能性があります。
PowerShell Core (別名v6)がリリースされたので、人々がクロスプラットフォームのスクリプトを書きたくなるかもしれませんが、ここでの答えの多くはうまくいきません。 Windows以外のもの.
プラットフォーム検出と特別な大文字小文字の区別をコードに追加したくない場合は、[Environment]::UserName
がPowerShellコアでサポートされているすべてのプラットフォームで現在のユーザー名を取得する最善の方法のように思われます。
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
2番目のユーザー名は、コピーして貼り付けた場合にのみ表示されるものです。それ。