回答:
見つけた:
$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@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"
[Environment]::UserName
場合、クロスプラットフォームで動作するため、これが最適なオプションです。whoami
も動作whoami
するようですが、プラットフォームで使用できるツールに依存します。
$env:USERNAME
しSYSTEM
ない限り生成されますが、[Environment]::UserName]
どちらかの方法でユーザー名を取得します。
Get-WmiObject
メソッドがpwshで機能しなくなったようです。互換性モジュールをインポートしようとしても、Microsoft.PowerShell.Management
それはコマンドレットを持っています。何が起こっているのでしょうか?
whoamiコマンドを投入したいと思い%USERDOMAIN%\%USERNAME%
ます。これは、基本的に他の回答で提案されているように実行するための良いエイリアスです。
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
ユーザーが変更できますが、これを行うことでだまされることはありません。
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
実行可能です。PowerShellから削除することはできません。これは、潜在的にWindowsのから除去することができますが、それは非ナノWindows Serverの2012のようまだそこだ
私は$env:username
以前使用しましたが、同僚が環境変数であり、ユーザーが変更できることを同僚が指摘したため、現在のユーザーのユーザー名を本当に取得したい場合は、それを信頼すべきではありません。
Mark Seemannの答えを賛成したい:[System.Security.Principal.WindowsIdentity] :: GetCurrent()。Name
しかし、私は許可されていません。マークの答えで、ユーザー名だけが必要な場合は、私のシステムでは返さhostname\username
れ、ドメインアカウントを持つドメインに参加しているマシンでは返されるため、ユーザー名を解析する必要があるかもしれませんdomain\username
。
whoami.exe
Windowsのすべてのバージョンに存在するわけではないので使用しません。別のバイナリへの呼び出しであり、一部のセキュリティチームに適合させることができます。
[Environment]::UserName
の独立した、より少ないタイピングで$env:username
参照してください:クロスプラットフォームpastebin.com/GsfR6Hrp
今すぐことPowerShellのコア(別名V6)がリリースされている、と人々はクロスプラットフォームのスクリプトを書きたいことがあり、ここでの回答の多くは、Windows以外では動作しません。
[Environment]::UserName
コードにプラットフォーム検出と特別な大文字小文字の区別を追加したくない場合は、PowerShell Coreでサポートされているすべてのプラットフォームで現在のユーザー名を取得する最良の方法のようです。
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
第二 のユーザ名は、あなたがそれをコピーして貼り付けた場合にのみ表示するためだけの目的です。
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()
UNLEN+1
、UNLEN
256です)。GetUserNameから返される可能性のあるエラーは無視されます( GetLastErrorを保持します(良い点)。文字列バッファはクリーンアップされません。そしておそらく他のいくつか。そして、他の人が言ったように、コメントも非常に欠けています。
私は最も使いやすいと思います:cd $ home \ Desktop \
私の場合、スクリプトがパスを変更できるように、ユーザー名を取得する必要がありました。c:\ users \%username%。ユーザーのデスクトップへのパスを変更してスクリプトを開始する必要がありました。get-locationアプレットを使用することで、上から、または他の場所からの助けを借りて、これを行うことができました。
あなたはそれを行う別の、またはさらに良い方法があるかもしれませんが、これは私にとってうまくいきました:
$ Path = Get-Location
Set-Location $ Path \ Desktop
バッチ処理に慣れている場合は、
$user=$(cmd.exe /c echo %username%)
これは基本的に、「echo%username%」だけのバッチファイルがある場合に得られる出力を盗みます。
$(...)
は不必要です:$a = cmd.exe /c echo %username%
動作します、b)それは移植可能ではありません、c)それは実際にpowershellでそれを行う方法の質問に答えません、それはdosでそれを行う方法に答えます、そしてそれは男に魚を与えるよりも、釣り竿を与える方がよいpowershell puts environment variables into $env, so %username% = $env:username
。
get-content "cm.txt"
write-host "entr file name"
$file = read-host
get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt"
for each ($line in $count)
{write-host $line}
私の場合、スクリプトがパスを変更できるように、ユーザー名を取得する必要がありました。c:\users\%username%\
。ユーザーのデスクトップへのパスを変更してスクリプトを開始する必要がありました。get-locationアプレットを使用することで、上から、または他の場所からの助けを借りて、これを行うことができました。
あなたはそれを行う別の、またはさらに良い方法があるかもしれませんが、これは私にとってうまくいきました:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
です。(Get-Location
現在の場所を返すだけで、これはSet-Location
相対パスを持つaに対して暗黙的です。)
$env:username
、対応する環境変数からユーザー名を取得することです。