Windows PowerShellで現在のユーザー名を取得するにはどうすればよいですか?


回答:


398

見つけた:

$env:UserName

もあります:

$env:UserDomain
$env:ComputerName

10
すばやく簡単な方法は$env:username、対応する環境変数からユーザー名を取得することです。
guillermooo 2010年

7
$ env:usernameと[Environment] :: UserNameはどちらも同じものを指していると思います。
ケファ

16
自分の質問に答えてくれてありがとう。誰かが自分で答えを見つけて、「気にしないで、わかった!」
Matt DiTrolio、2012年

6
@MattDiTrolio確かにイライラしますが、それ以上にイライラするものはないと思いますか?!
コードジョッキー

5
@CodeJockey何もありません。今までの歴史にはありません。:)
Matt DiTrolio、2015

180
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

16
これは$env:USERNAMEユーザーが変更できるため、最も安全な回答ですが、そうしても騙されません。
Kevin Panko 14

6
@KevinPanko確かに、ユーザーを信用できない時点で、他に、もっと哲学的な質問をする必要があります。;-)
jpaugh 2016年

4
この方法には、ドメイン名とユーザー名が含まれます。複数のドメインを使用している場合は、間違いなく有益です。
Ryan Gates、

期待どおりに動作します。URLアドレス予約のテスト。
Marek Bar

また、これはPowerShell 6でも機能するようです。つまり、クロスプラットフォーム(.Net Standard)と互換性があります。名前空間を見たときに質問したので、言及する価値があると思いました。
deadlydog

120

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

環境変数にアクセスしたい場合:

(より簡単/より短い/記憶できるオプション)

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

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

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

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

ログインしているユーザーの名前が必要な場合

(PowerShellインスタンスを実行しているユーザーの名前ではありません)


比較

@Mark Seemannの回答に対する@Kevin Pankoのコメントは、カテゴリのいずれかを選択することを扱っています。

[Windowsアクセストークンアプローチ]は、$ env:USERNAMEがユーザーによって変更される可能性があるため、最も安全な答えですが、これを行うことでだまされることはありません。

つまり、環境変数オプションの方が簡潔で、Windowsアクセストークンオプションの信頼性が高くなります。

偽装を使用してC#アプリケーションから実行していたPowerShellスクリプトで、@ Mark SeemannのWindowsアクセストークンアプローチを使用する必要がありました。

C#アプリケーションは自分のユーザーアカウントで実行され、PowerShellスクリプトをサービスアカウントとして実行します。C#からPowerShellスクリプトを実行する方法の制限のため、PowerShellインスタンスは、サービスアカウントユーザーとして実行されている場合でも、ユーザーアカウントの環境変数を使用します。

このセットアップでは、環境変数オプションは私のアカウント名を返し、Windowsアクセストークンオプションはサービスアカウント名(私が欲しかったもの)を返し、ログインユーザーオプションは私のアカウント名を返します。


テスト中

また、オプションを自分で比較したい場合は、別のユーザーとしてスクリプトを実行するために使用できるスクリプトを次に示します。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"

Mac OS XおよびLinux上のPowerShell 6の[Environment]::UserName場合、クロスプラットフォームで動作するため、これが最適なオプションです。whoamiも動作whoamiするようですが、プラットフォームで使用できるツールに依存します。
Florian Feldhaus、

Windows上のPowershell 6の場合、管理者として実行$env:USERNAMESYSTEMない限り生成されますが、[Environment]::UserName]どちらかの方法でユーザー名を取得します。
kfsone

1
Get-WmiObjectメソッドがpwshで機能しなくなったようです。互換性モジュールをインポートしようとしても、Microsoft.PowerShell.Managementそれはコマンドレットを持っています。何が起こっているのでしょうか?
not2qubit

正しい。パフォーマンス上の理由からかなり前からGet-CimInstanceに夢中だった... 相互互換性の理由から、v6ではWMIを介し CIM 使用する必要があります。GWMIでコマンドが表示される場合は、代わりにGCIMを実行できるかどうかを確認してください。
Hicsy


51

whoamiコマンドを投入したいと思い%USERDOMAIN%\%USERNAME%ます。これは、基本的に他の回答で提案されているように実行するための良いエイリアスです。

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

PSバージョン2で動作します。PS3で削除されたということですか?C:\> powershell Windows PowerShell Copyright(C)2009 Microsoft Corporation。全著作権所有。PS C:\> whoami mydomain \ myusername
galaktor

2
$env:USERNAMEユーザーが変更できますが、これを行うことでだまされることはありません。
Kevin Panko 14

3
whoamiがインタラクティブ使用で勝利しました。SOに相談せずに入力する方法を思い出せるほど短いので、:-)
Iain Samuel McLean Elder

Nano Serverにはありません。スクリプトでは使用せず、正しいことを行ってください([System.Security.Principal.WindowsIdentity]::GetCurrent().Name
まだ別のユーザー

whoami実行可能です。PowerShellから削除することはできません。これは、潜在的にWindowsのから除去することができますが、それは非ナノWindows Serverの2012のようまだそこだ
jpmc26

37

[Environment]::UserNameユーザー名のみを返します。たとえば、bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Nameはユーザー名を返し、必要に応じてドメインのプレフィックスを付けます。例:SOMEWHERENICE \ bob


12

私は$env:username以前使用しましたが、同僚が環境変数であり、ユーザーが変更できることを同僚が指摘したため、現在のユーザーのユーザー名を本当に取得したい場合は、それを信頼すべきではありません。

Mark Seemannの答えを賛成したい:[System.Security.Principal.WindowsIdentity] :: GetCurrent()。Name

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

whoami.exeWindowsのすべてのバージョンに存在するわけではないので使用しません。別のバイナリへの呼び出しであり、一部のセキュリティチームに適合させることができます。


1
OPは有効ですが、Windows PowerShellの-、について尋ねなかったため[Environment]::UserNameの独立した、より少ないタイピングで$env:username参照してください:クロスプラットフォームpastebin.com/GsfR6Hrp
kfsone

12

今すぐことPowerShellのコア(別名V6)がリリースされている、と人々はクロスプラットフォームのスクリプトを書きたいことがあり、ここでの回答の多くは、Windows以外では動作しません。

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


10

ここで他の人の仕事に基づいて構築するだけです:

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

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

$username

第二 のユーザ名は、あなたがそれをコピーして貼り付けた場合にのみ表示するためだけの目的です。


$ fullname = Get-WMIObject -class Win32_ComputerSystem | -ExpandPropertyユーザ名$ユーザ名= $ fullname.Replace( "DOMAIN \"、 "")$ユーザ名を、オブジェクトの選択
clayton.nichols

-1

Add-Typeベースの例はありませんでした。これは、advapi32.dllから直接GetUserNameを使用するものです。

$sig = @'
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool GetUserName(System.Text.StringBuilder sb, ref Int32 length);
'@

Add-Type -MemberDefinition $sig -Namespace Advapi32 -Name Util

$size = 64
$str = New-Object System.Text.StringBuilder -ArgumentList $size

[Advapi32.util]::GetUserName($str, [ref]$size) |Out-Null
$str.ToString()

1
このコードが何をしているか、なぜそれがより短い方法の1つよりも有用であるかを説明してください。
ベンジャミンハバード

@BenjaminHubbard質問は、最短の方法を要求するのではなく、Powershellでこの偉業を達成する方法を要求します。これは、dll内の関数を呼び出し、Add-Typeメソッドを使用して.NETにアクセスすることで、他の例とは異なる方法でトリックを実行します。
Knuckle-Dragger 2015

1
これは斬新なコードブロックですが、一体何をしているのか私が知っていればすばらしいでしょう。コメントで注釈を付けることはできますか?ありがとう!
jpaugh 2016年

1
私は提案に対するメリットを見たので、賛成票を差し上げようとしていました。ただし、コードにはいくつかの欠陥があります。新しい名前空間が導入され、医師が規定した値ではない魔法の定数(64)が使用されます(あるべきでありUNLEN+1UNLEN256です)。GetUserNameから返される可能性のあるエラーは無視されます( GetLastErrorを保持します(良い点)。文字列バッファはクリーンアップされません。そしておそらく他のいくつか。そして、他の人が言ったように、コメントも非常に欠けています。
AntoineL 2017年

-1

私は最も使いやすいと思います:cd $ home \ Desktop \

現在のユーザーのデスクトップに移動します

私の場合、スクリプトがパスを変更できるように、ユーザー名を取得する必要がありました。c:\ users \%username%。ユーザーのデスクトップへのパスを変更してスクリプトを開始する必要がありました。get-locationアプレットを使用することで、上から、または他の場所からの助けを借りて、これを行うことができました。

あなたはそれを行う別の、またはさらに良い方法があるかもしれませんが、これは私にとってうまくいきました:

$ Path = Get-Location

Set-Location $ Path \ Desktop


ホームディレクトリに基づいて仮定を行うと、非常に特定の条件下でのみ機能するようになります。
ラウル・サリナス- Monteagudo

powershellターミナルで作業していて、自分がどのユーザーであるかをすぐに知りたい場合は、「ls〜」と入力するとうまくいきます。上記のポスターのように、例外がある可能性があり、これは間違いなくスクリプトには適していません。その場合は、エドゥアールプアーの例を使用してください。
MrBerta

-2

バッチ処理に慣れている場合は、

$user=$(cmd.exe /c echo %username%)

これは基本的に、「echo%username%」だけのバッチファイルがある場合に得られる出力を盗みます。


1
次の理由で私は反対票を投じています:a)あなた$(...)は不必要です:$a = cmd.exe /c echo %username%動作します、b)それは移植可能ではありません、c)それは実際にpowershellでそれを行う方法の質問に答えません、それはdosでそれを行う方法に答えます、そしてそれは男に魚を与えるよりも、釣り竿を与える方がよいpowershell puts environment variables into $env, so %username% = $env:username
kfsone 2018

-2
  1. get-content "cm.txt"
  2. write-host "entr file name" $file = read-host get-content $file
  3. $content = get-content "cm.txt"
  4. $content = get-content "cn.txt" for each ($line in $count) {write-host $line}

$ contents = get-content "cm.txt" ---- $ count = 0 ----- foreach($ line in $ count)---- {$ count = $ count + 1} ----書き込み-host "あなたはこれらの多くの行を持っています:" $ count
ammy

1. $ a = $ com1、$ com2 ------ write-host "enter cm name" ---- $ c = readhost ----- write-host $ a [$ c-1] .username 、write-host $ a [$ c-1] .password
ammy

$ com1 =新しいオブジェクトPSobject ----- $ com1 = $ com1 | add-member noteproperty -name username -value 2016
ammy

1
あなた自身の答えにコメントとしてコードを追加する理由はありませんか?
aldr

1
答えを編集してコードを追加して、誰も理解できないようなコメントに分割しないでください。
aldr

-4

私の場合、スクリプトがパスを変更できるように、ユーザー名を取得する必要がありました。c:\users\%username%\。ユーザーのデスクトップへのパスを変更してスクリプトを開始する必要がありました。get-locationアプレットを使用することで、上から、または他の場所からの助けを借りて、これを行うことができました。

あなたはそれを行う別の、またはさらに良い方法があるかもしれませんが、これは私にとってうまくいきました:

$Path = Get-Location

Set-Location $Path\Desktop

1
Stack Overflowへようこそ!これはと同等Set-Location Desktopです。(Get-Location現在の場所を返すだけで、これはSet-Location相対パスを持つaに対して暗黙的です。)
jpaugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.