Windows PowerShell'de geçerli kullanıcı adını nasıl edinebilirim?


Yanıtlar:


398

Buldum:

$env:UserName

Ayrıca birde şu var:

$env:UserDomain
$env:ComputerName

10
Hızlı ve kirli bir alternatif $env:username, ilgili ortam değişkeninden kullanıcı adını almaktır.
guillermooo

7
Bence $ env: username ve [Environment] :: UserName ikisi de aynı şeye işaret ediyor.
Cephas

16
Kendi sorunuzu cevaplamak için geri geldiğiniz için teşekkür ederiz. Birisi cevabı kendiliğinden çözüp basitçe, "Boş ver, anladım!"
Matt DiTrolio

6
@MattDiTrolio Bu kesinlikle sinir bozucu, ama bundan daha sinir bozucu bir şey olmadığını mı düşünüyorsun ?!
Kod Jokey

5
@CodeJockey Hiçbir şey. Asla tarihte değil. :)
Matt DiTrolio

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

16
Bu en güvenli cevaptır, çünkü $env:USERNAMEkullanıcı tarafından değiştirilebilir, ancak bu kandırılmayacaktır.
Kevin Panko

6
@KevinPanko Doğru, ancak kullanıcılarınıza güvenemeyeceğiniz noktada, sorulması gereken başka, daha felsefi sorular var. ;-)
jpaugh

4
Bu yöntem, alan adını ve kullanıcı adını içerir. Oyunda birden fazla alanınız varsa kesinlikle faydalıdır.
Ryan Gates,

Beklendiği gibi çalışır. URL adresi rezervasyonu için test edildi.
Marek Bar

Ayrıca, bu PowerShell 6'da da çalışıyor gibi görünüyor, yani çapraz platform (.Net Standard) uyumlu. İsim alanını gördüğümde sorguladığımdan beri bahsetmeye değer olduğunu düşündüm.
deadlydog

120

Verilen cevapları özetlemenin ve karşılaştırmanın değerli olacağını düşündüm.

Ortam değişkenine erişmek istiyorsanız :

(daha kolay / daha kısa / unutulmaz seçenek)

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

Windows erişim belirtecine erişmek istiyorsanız :

(daha güvenilir seçenek)

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

Oturum açmış kullanıcının adını istiyorsanız

(PowerShell örneğini çalıştıran kullanıcının adı yerine)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username- @TwonOfAn bu forumda

karşılaştırma

@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.


Test yapmak

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"

Mac OS X ve Linux'ta PowerShell 6 için [Environment]::UserName, çapraz platformda çalıştığı için en iyi seçenektir. whoamiaynı zamanda işe yarıyor gibi görünüyor, ancak whoamiplatformda bulunan araca bağlıdır .
Florian Feldhaus

Windows'ta Powershell 6 için yönetici olarak çalışmadığım sürece $env:USERNAMEüretirken kullanıcı adımı her iki şekilde de verir. SYSTEM[Environment]::UserName]
kfsone

1
Get-WmiObjectYöntem artık pwsh'de çalışmıyor gibi görünüyor . Hatta uyumluluk modülünü almaya çalıştı ve Microsoft.PowerShell.Managementbu cmdlet'e sahip. Ne olduğu hakkında bir fikrin var mı?
not2qubit

Doğru. Bitti fazed edildi için Get-CimInstance oldukça performans nedenleriyle geri ... ve CIM ederken sahiptir arası uyumluluk nedenleriyle v6 içinde WMI üzerinde kullanılacak. GWMI ile bir komut görürseniz, bunun yerine GCIM yapıp yapamayacağınızı kontrol edin.
Hicsy

105

$env:username en kolay yol


Bu şekilde atayabilir ve dizinler oluşturabilir ve ne yapamazsınız.
Droogans

51

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)

PS sürüm 2'de benim için çalışıyor. PS3'e düşürüldüğünü mü söylüyorsun? C: \> powershell Windows PowerShell Telif Hakkı (C) 2009 Microsoft Corporation. Tüm hakları Saklıdır. PS C: \> whoami alan adı \ kullanıcı adı
galaktor

2
$env:USERNAMEkullanıcı tarafından değiştirilebilir, ancak bu kandırılmayacaktır.
Kevin Panko

3
whoami interaktif kullanım için kazanır. SO :-) danışmadan nasıl yazacağımı hatırlayabileceğim kadar kısa
Iain Samuel McLean Elder

Nano Sunucu'da bir şey değil. Komut dosyalarında kullanmayın, doğru olanı yapın ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Yine Bir Kullanıcı

whoamiyü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
beri

37

[Environment]::UserNameyalnı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


12

$env:usernameGeç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\usernameve 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.


1
OP geçerli, ama Windows Powershell, hakkında sormak did yana [Environment]::UserNamebağımsız, daha az yazı olduğunu $env:usernameBkz: ve çapraz platform pastebin.com/GsfR6Hrp
kfsone

12

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.


10

Sadece burada başkalarının çalışmalarına dayanmak:

[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

İkinci adı kopyalayıp yapıştırın sadece EKRANI amaçlıdır.


$ fullname = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty kullanıcı adı $ username = $ fullname.Replace ("DOMAIN \", "") $ kullanıcı adı
clayton.nichols

-1

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()

1
Lütfen bu kodun ne yaptığını ve neden daha kısa yöntemlerden daha yararlı olacağını açıklayın.
Benjamin Hubbard

@BenjaminHubbard Soru en kısa yöntemi istemiyor, bu gücü powershell ile nasıl başaracağını soruyor. Bu, dll içindeki işlevi çağırarak ve .NET'e erişmek için Add-Type yöntemini kullanarak diğer örneklerden farklı olarak hile yapar.
Knuckle-Dragger

1
Bu yeni bir kod bloğu olsa da, ne halt yaptığını bilseydim harika olurdu. Belki yorumlarla açıklayabilir misiniz? Teşekkürler!
jpaugh

1
Teklifin değerini gördüğüm için neredeyse oy kullanmak istiyordum. Yine de kodun bazı kusurları var: yeni bir ad alanı getiriyor, doktorun reçete ettiği (olması gereken UNLEN+1ve UNLEN256 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.
AntoineL

-1

Kullanımı en kolay yolu buluyorum: cd $ home \ Desktop \

sizi mevcut kullanıcı masaüstüne götürecek

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


Giriş dizinine dayalı herhangi bir varsayımda bulunmak sadece çok özel koşullar altında çalışmak zorundadır.
Raúl Salinas-Monteagudo

Bir powershell terminalinde çalışıyorsanız ve hızlı bir şekilde hangi kullanıcı olduğunuzu bulmak istiyorsanız, "ls ~" yazmak hile yapmalıdır. Yukarıdaki poster gibi, istisnalar olabilir ve bu senaryolar için kesinlikle iyi değildir, bu durumda Edouard Poor'un örneğini kullanın.
MrBerta

-2

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.


1
Aşağı düşüyorum çünkü: a) Sen $(...)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.
kfsone

-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}

$ content = get-content "cm.txt" ---- $ count = 0 ----- foreach ($ count içindeki $ line) ---- {$ count = $ count + 1} ---- yazma -host "şu birçok satıra sahipsiniz:" $ count
ammy

1. $ a = $ com1, $ com2 ------ yazma-host "cm adını girin" ---- $ c = readhost ----- yazma-host $ a [$ c-1]. Kullanıcı adı , yazma-sunucusu $ a [$ c-1]
.şifre

$ com1 = yeni nesne PSobject ----- $ com1 = $ com1 | add-member noteproperty-adı kullanıcı adı -değer 2016
ammy

1
kendi cevabınıza yorum olarak kod eklemenizin bir nedeni var mı?
aldr

1
neden cevabınızı düzenlemiyorsunuz ve kodu kimsenin anlayamayacağı şekilde yorumlara bölmek yerine eklemiyorsunuz?
aldr

-4

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

1
Stack Overflow'a hoş geldiniz ! Bu eşdeğerdir Set-Location Desktop. ( Get-Locationyalnızca geçerli konumu döndürür; bu, Set-Locationgöreli bir yolu olan bir için
örtüktür
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.