Windows PowerShell'de geçerli kullanıcı adını nasıl edinebilirim?
Windows PowerShell'de geçerli kullanıcı adını nasıl edinebilirim?
Yanıtlar:
Buldum:
$env:UserName
Ayrıca birde şu var:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
kullanıcı tarafından değiştirilebilir, ancak bu kandırılmayacaktır.
Verilen cevapları özetlemenin ve karşılaştırmanın değerli olacağını düşündüm.
(daha kolay / daha kısa / unutulmaz seçenek)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(daha güvenilir seçenek)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(PowerShell örneğini çalıştıran kullanıcının adı yerine)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn bu forumda@Kevin Panko'nun @Mark Seemann'ın yanıtı, kategorilerden birini diğerine göre seçmeyle ilgili yorumu:
[Windows erişim belirteci yaklaşımı] en güvenli yanıttır, çünkü $ env: USERNAME kullanıcı tarafından değiştirilebilir, ancak bu kandırılmayacaktır.
Kısacası, ortam değişkeni seçeneği daha özlüdür ve Windows erişim belirteci seçeneği daha güvenilirdir.
Ben kimliğe bürünme ile bir C # uygulamadan çalıştırdığınız bir PowerShell betiğinde @Mark Seemann'ın Windows erişim belirteci yaklaşımını kullanmak zorunda kaldım.
C # uygulaması kullanıcı hesabımla çalıştırılıyor ve PowerShell betiğini bir hizmet hesabı olarak çalıştırıyor. PowerShell betiğini C # 'dan çalıştırma şeklimin bir sınırlaması nedeniyle, PowerShell örneği, hizmet hesabı kullanıcısı olarak çalıştırılsa bile kullanıcı hesabımın ortam değişkenlerini kullanır.
Bu kurulumda, ortam değişkeni seçenekleri hesap adımı döndürür ve Windows erişim belirteci seçeneği hizmet hesap adını (istediğim gibi) döndürür ve oturum açmış kullanıcı seçeneği hesap adımı döndürür.
Ayrıca, seçenekleri kendiniz karşılaştırmak istiyorsanız, bir komut dosyasını başka bir kullanıcı olarak çalıştırmak için kullanabileceğiniz bir komut dosyası. Kimlik bilgisi nesnesi almak için Get-Credential cmdlet'ini kullanmanız ve daha sonra bu komut dosyasını komut 1 ile başka bir kullanıcı olarak argüman 1 olarak ve kimlik bilgisi nesnesini de argüman 2 olarak çalıştırmanız gerekir.
Kullanımı:
$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 betiğinin içeriği:
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
, çapraz platformda çalıştığı için en iyi seçenektir. whoami
aynı zamanda işe yarıyor gibi görünüyor, ancak whoami
platformda bulunan araca bağlıdır .
$env:USERNAME
üretirken kullanıcı adımı her iki şekilde de verir. SYSTEM
[Environment]::UserName]
Get-WmiObject
Yöntem artık pwsh'de çalışmıyor gibi görünüyor . Hatta uyumluluk modülünü almaya çalıştı ve Microsoft.PowerShell.Management
bu cmdlet'e sahip. Ne olduğu hakkında bir fikrin var mı?
Diğer cevaplarda önerildiği gibi yapmak için güzel bir takma ad olan whoami komutunu atmak istiyorum %USERDOMAIN%\%USERNAME%
.
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
kullanıcı tarafından değiştirilebilir, ancak bu kandırılmayacaktır.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
yürütülebilir bir dosyadır. PowerShell'den kaldırılamaz. Potansiyel olarak Windows'tan kaldırılabilir, ancak Nano olmayan Windows Server 2012'den
[Environment]::UserName
yalnızca kullanıcı adını döndürür. Örneğin bob
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
, uygun olduğu durumlarda alan adının önüne eklenmiş kullanıcı adını döndürür. Örneğin, SOMEWHERENICE \ bob
$env:username
Geçmişte kullandım , ancak bir meslektaşım bunun bir ortam değişkeni olduğuna ve kullanıcı tarafından değiştirilebileceğine dikkat çekti ve bu nedenle, mevcut kullanıcının kullanıcı adını gerçekten almak istiyorsanız, buna güvenmemelisiniz.
Mark Seemann'ın cevabını onaylıyorum: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
Ama izin verilmiyor. Mark'ın cevabı ile, sadece kullanıcı adına ihtiyacınız varsa, sistemimden beri geri ayrılmanız gerekebilir, geri döner hostname\username
ve geri dönecek etki alanı hesapları olan etki alanına katılmış makinelerde domain\username
.
Kullanmayacağım whoami.exe
çünkü tüm Windows sürümlerinde mevcut değil ve başka bir ikili dosyaya çağrı yapıyor ve bazı güvenlik ekiplerine uyuyor olabilir.
[Environment]::UserName
bağımsız, daha az yazı olduğunu $env:username
Bkz: ve çapraz platform pastebin.com/GsfR6Hrp
Artık PowerShell Core (aka v6) piyasaya sürüldüğüne ve insanlar platformlar arası komut dosyaları yazmak isteyebileceğine göre, buradaki cevapların çoğu Windows dışında bir şey üzerinde çalışmayacak.
[Environment]::UserName
kodunuza platform algılama ve özel kasa eklemek istemiyorsanız, PowerShell Core tarafından desteklenen tüm platformlarda geçerli kullanıcı adını almanın en iyi yolu gibi görünüyor.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
İkinci adı kopyalayıp yapıştırın sadece EKRANI amaçlıdır.
Herhangi bir Add-Type tabanlı örnek görmedim . İşte doğrudan advapi32.dll'den GetUserName kullanan biri.
$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
ve UNLEN
256 olması gereken) değer olmayan sihirli bir sabit (64) kullanıyor , GetUserName'den (üzerinden gönderilebilecek herhangi bir hatayı göz ardı ediyor) GetLastError, iyi bir nokta korur), dize arabelleğini temizlemez; ve muhtemelen bazı diğerleri. Diğerlerinin söylediği gibi, yorumlar da çok eksik.
Kullanımı en kolay yolu buluyorum: cd $ home \ Desktop \
Benim durumumda, komut dosyasının yolunu değiştirmesini sağlamak için kullanıcı adını almam gerekiyordu, yani. c: \ kullanıcılar \% username%. Kullanıcı masaüstüne yolu değiştirerek komut dosyasını başlatmak gerekiyordu. Bunu get-applet uygulamasını kullanarak yukarıdan ve başka yerlerden yardım alarak yapabildim.
Bunu yapmanın başka bir yolu ya da daha iyi bir yolu olabilir, ama bu benim için çalıştı:
$ Path = Konum Al
Set-Location $ Path \ Desktop
Toplu olarak alışkınsanız,
$user=$(cmd.exe /c echo %username%)
Bu sadece "echo% username%" ile bir toplu iş dosyanız olsaydı elde edeceğiniz çıktıyı çalar.
$(...)
gereksizsin: $a = cmd.exe /c echo %username%
çalışıyor, b) taşınabilir değil, c) aslında powershell'de nasıl yapılacağı sorusuna cevap vermiyor, dos olarak nasıl yapılacağını cevaplıyor ve bir erkeğe balık oltası vermek daha iyi, örneğin bir balık vermek 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}
Benim durumumda, komut dosyasının yolunu değiştirmesini sağlamak için kullanıcı adını almam gerekiyordu, yani. c:\users\%username%\
. Kullanıcı masaüstüne yolu değiştirerek komut dosyasını başlatmak gerekiyordu. Bunu get- applet uygulamasını kullanarak yukarıdan ve başka yerlerden yardım alarak yapabildim .
Bunu yapmanın başka bir yolu ya da daha iyi bir yolu olabilir, ama bu benim için çalıştı:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
. ( Get-Location
yalnızca geçerli konumu döndürür; bu, Set-Location
göreli bir yolu olan bir için
$env:username
, ilgili ortam değişkeninden kullanıcı adını almaktır.