web-dev-qa-db-ja.com

Windows PowerShellで現在のユーザー名を取得する方法を教えてください。

Windows PowerShellで現在のユーザー名を取得する方法を教えてください。

262
Thomas Bratt

見つけた:

$env:UserName

もあります:

$env:UserDomain
$env:ComputerName
332
Thomas Bratt
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
153
Mark Seemann

$env:usernameが最も簡単な方法です

102
Eoin

与えられた答えをまとめて比較することは価値があると思いました。

環境変数にアクセスする場合

(より簡単/短く/思い出に残るオプション)

  • [Environment]::UserName - @ThomasBratt
  • $env:username - @Eoin
  • whoami - @galaktor

Windowsアクセストークンにアクセスする場合

(より信頼できるオプション)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @MarkSeemann

ログインユーザーの名前が欲しい場合

(PowerShellインスタンスを実行しているユーザーの名前ではなく)


比較

@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"
97
alexanderbird

whoami コマンドを投入したいのですが、これは基本的に他の回答で提案されているように%USERDOMAIN%\%USERNAME%を実行するためのNiceの別名です。

Write-Host "current user:"
Write-Host $(whoami)
49
galaktor

[Environment]::UserNameはユーザー名だけを返します。例えば。 bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Nameは、必要に応じてドメインを先頭に付けたユーザー名を返します。例えば。 SOMEWHERENICE\bob

33
WaffleSouffle

ここで他人の仕事の上に構築するだけです:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
8
Stef

私は過去に$env:usernameを使っていましたが、同僚はそれが環境変数でありユーザーによって変更される可能性があることを指摘しました。

私はMark Seemannの答えを支持します:[System.Security.Principal.WindowsIdentity] :: GetCurrent()。Name

しかし、私は許可されていません。 Markの答えでは、ユーザー名だけが必要な場合は、解析する必要があります。これは、私のシステムではhostname\usernameを返し、ドメインアカウントを持つドメインに参加しているコンピュータではdomain\usernameを返すためです。

whoami.exeはWindowsのすべてのバージョンに存在するわけではないので、私は使用しません。それは別のバイナリへの呼び出しであり、一部のセキュリティチームに適している可能性があります。

8
Dave Hull

PowerShell Core (別名v6)がリリースされたので、人々がクロスプラットフォームのスクリプトを書きたくなるかもしれませんが、ここでの答えの多くはうまくいきません。 Windows以外のもの.

プラットフォーム検出と特別な大文字小文字の区別をコードに追加したくない場合は、[Environment]::UserNameがPowerShellコアでサポートされているすべてのプラットフォームで現在のユーザー名を取得する最善の方法のように思われます。

5
Edouard Poor
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

2番目のユーザー名は、コピーして貼り付けた場合にのみ表示されるものです。それ。

0
clayton.nichols