मुझे Windows PowerShell में वर्तमान उपयोगकर्ता नाम कैसे मिलेगा?


जवाबों:


397

मुझे यह मिला:

$env:UserName

वहाँ भी:

$env:UserDomain
$env:ComputerName

10
एक त्वरित और गंदा विकल्प $env:usernameइसी पर्यावरण चर से उपयोगकर्ता नाम को पुनः प्राप्त करना होगा ।
गिलर्मो

7
मुझे लगता है कि $ env: उपयोगकर्ता नाम और [पर्यावरण] :: उपयोगकर्ता नाम दोनों एक ही बात की ओर इशारा करते हैं।
सेफस

16
आपके अपने प्रश्न का उत्तर देने के लिए वापस आने के लिए धन्यवाद। इससे ज्यादा निराशा की बात नहीं है जब कोई व्यक्ति खुद ही जवाब दे और बस जवाब दे, "कोई बात नहीं, मिल गया!"
मैट डायट्रिओ

6
@MattDiTrolio यह निश्चित रूप से निराशाजनक है, लेकिन आपको लगता है कि इससे ज्यादा निराशाजनक कुछ नहीं है ?!
कोड जॉकी

5
@ कोडजॉकी कुछ नहीं। इतिहास में कभी नहीं। :)
मैट डिट्रोलियो

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

16
यह सबसे सुरक्षित उत्तर है क्योंकि $env:USERNAMEउपयोगकर्ता द्वारा बदल दिया जा सकता है, लेकिन ऐसा करने से यह मूर्खतापूर्ण नहीं होगा।
केविन पैंको

6
@ केविनपैंको ट्रू, लेकिन इस बिंदु पर कि आप अपने उपयोगकर्ता पर भरोसा नहीं कर सकते हैं, अन्य, अधिक दार्शनिक प्रश्न हैं जिन्हें पूछने की आवश्यकता है। ;-)
jpaugh

4
इस विधि में डोमेन नाम और उपयोगकर्ता नाम शामिल हैं। यदि आपके पास खेलने के लिए कई डोमेन हैं, तो निश्चित रूप से फायदेमंद है।
रयान गेट्स

उम्मीद के मुताबिक काम करता है। Url पता आरक्षण के लिए परीक्षण किया गया।
मारेक बार

इसके अलावा, यह PowerShell 6 में भी काम करता है, जिसका अर्थ है कि यह क्रॉस प्लेटफॉर्म (.net Standard) संगत है। सोचा था कि यह उल्लेख के लायक है क्योंकि मैंने यह सवाल किया था जब मैंने नामस्थान देखा था।
डेडलीडॉग

120

मैंने सोचा कि दिए गए उत्तरों को संक्षेप में प्रस्तुत करना और तुलना करना मूल्यवान होगा।

यदि आप पर्यावरण चर का उपयोग करना चाहते हैं :

(आसान / छोटा / यादगार विकल्प)

  • [Environment]::UserName - @ThomasBratt
  • $env:username - @ इयॉन
  • whoami - @ कलक्टर

अगर आप विंडोज एक्सेस टोकन एक्सेस करना चाहते हैं :

(अधिक भरोसेमंद विकल्प)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @ मर्कसिमन्न

यदि आप उपयोगकर्ता में लॉग इन का नाम चाहते हैं

(PowerShell उदाहरण चलाने वाले उपयोगकर्ता के नाम के बजाय)


तुलना

@ केविन पान्को की टिप्पणी @ मर्क सेमन के जवाब पर एक के बाद एक श्रेणियों को चुनने के बारे में है:

[विंडोज एक्सेस टोकन दृष्टिकोण] सबसे सुरक्षित जवाब है, क्योंकि $ env: USERNAME को उपयोगकर्ता द्वारा बदल दिया जा सकता है, लेकिन ऐसा करने से यह मूर्खतापूर्ण नहीं होगा।

संक्षेप में, पर्यावरण चर विकल्प अधिक रसीला है, और विंडोज एक्सेस टोकन विकल्प अधिक भरोसेमंद है।

मुझे PowerShell स्क्रिप्ट में @Mark सेमन के विंडोज एक्सेस टोकन दृष्टिकोण का उपयोग करना पड़ा है जिसे मैं प्रतिरूपण के साथ C # अनुप्रयोग से चला रहा था।

C # एप्लिकेशन मेरे उपयोगकर्ता खाते के साथ चलाया जाता है, और यह एक सेवा खाते के रूप में PowerShell स्क्रिप्ट चलाता है। सी # से PowerShell स्क्रिप्ट को चलाने के तरीके की एक सीमा के कारण, PowerShell उदाहरण मेरे उपयोगकर्ता खाते के पर्यावरण चर का उपयोग करता है, भले ही यह सेवा खाता उपयोगकर्ता के रूप में चलाया जाता है।

इस सेटअप में, पर्यावरण चर विकल्प मेरा खाता नाम वापस करते हैं, और विंडोज एक्सेस टोकन विकल्प सेवा खाता नाम (जो मैं चाहता था) देता है, और लॉग इन उपयोगकर्ता विकल्प मेरा खाता नाम लौटाता है।


परिक्षण

इसके अलावा, यदि आप स्वयं विकल्पों की तुलना करना चाहते हैं, तो यहां एक स्क्रिप्ट है जिसका उपयोग आप स्क्रिप्ट को किसी अन्य उपयोगकर्ता के रूप में चलाने के लिए कर सकते हैं। आपको क्रेडेंशियल ऑब्जेक्ट प्राप्त करने के लिए गेट-क्रेडेंशियल cmdlet का उपयोग करने की आवश्यकता है, और फिर इस स्क्रिप्ट को तर्क 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प्लेटफॉर्म पर उपलब्ध उपकरण पर निर्भर करता है।
फ्लोरियन फेलदौस

विंडोज पर पॉवर्सशेल 6 के लिए, जब तक मैं रन-ए-एडमिनिस्ट्रेटर नहीं चलता , तब तक $env:USERNAMEउत्पादन करता है SYSTEM, जबकि [Environment]::UserName]मेरे उपयोगकर्ता नाम को किसी भी तरह से पैदावार देता है।
kfsone

1
Get-WmiObjectविधि की तरह लगता है अब pwsh में काम नहीं करता है। यहां तक ​​कि संगतता मॉड्यूल को आयात करने की कोशिश की गई और Microsoft.PowerShell.Managementजिसमें cmdlet है। किसी भी विचार क्या हो रहा है?
not2qubit

सही बात। यह प्रदर्शन कारणों के लिए कुछ समय पहले Get-CimInstance से अधिक हैरान था ... और CIM को क्रॉस-अनुकूलता कारणों के लिए V6 में WMI पर उपयोग किया जाना है। यदि आप GWMI के साथ एक कमांड देखते हैं, तो जांचें कि क्या आप इसके बजाय GCIM कर सकते हैं।
हिस्टी

105

$env:username सबसे आसान तरीका है


आप इसे इस तरह से असाइन कर सकते हैं, और निर्देशिकाओं का निर्माण कर सकते हैं और क्या नहीं।
दरोगांस

51

मैं हूमी कमांड में फेंकना चाहता हूं , जो मूल %USERDOMAIN%\%USERNAME%रूप से अन्य उत्तरों में प्रस्तावित के रूप में करने के लिए एक अच्छा उपनाम है।

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

यह मेरे लिए PS संस्करण 2 पर काम करता है। क्या आप कह रहे हैं कि इसे PS3 में गिरा दिया गया था? C: \> शक्तियाँ Windows PowerShell कॉपीराइट (C) 2009 Microsoft Corporation। सभी अधिकार सुरक्षित। PS C: \> whoami mydomain \ myusername
galaktor

2
$env:USERNAMEउपयोगकर्ता द्वारा बदला जा सकता है, लेकिन ऐसा करने से यह मूर्ख नहीं होगा।
केविन पैंको

3
whoami इंटरैक्टिव उपयोग के लिए जीतता है। यह इतना छोटा है कि मैं इसे याद कर सकता हूं कि एसओ :-) के परामर्श के बिना इसे कैसे टाइप किया जाए
Iain Samuel McLean Elder

नैनो सर्वर में कोई बात नहीं। लिपियों में इसका उपयोग न करें, सही काम करें ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
फिर भी एक अन्य उपयोगकर्ता

whoamiएक निष्पादन योग्य है। इसे PowerShell से हटाया नहीं जा सकता है। इसे संभवतः विंडोज से हटाया जा सकता है, लेकिन यह अभी भी गैर-नैनो विंडोज सर्वर 2012 के रूप में है।
jpmc26

37

[Environment]::UserNameकेवल उपयोगकर्ता नाम लौटाता है। उदाहरण के लिए, बॉब [System.Security.Principal.WindowsIdentity]::GetCurrent().Name अपने डोमेन द्वारा उपसर्गित उपयोगकर्ता नाम लौटाता है, जहाँ उपयुक्त हो। जैसे SOMEWHERENICE \ bob


12

मैंने उपयोग कर लिया है $env:username अतीत में है, लेकिन एक सहयोगी ने बताया कि यह एक पर्यावरण चर है और इसे उपयोगकर्ता द्वारा बदला जा सकता है और इसलिए, यदि आप वास्तव में वर्तमान उपयोगकर्ता का उपयोगकर्ता नाम प्राप्त करना चाहते हैं, तो आपको इस पर भरोसा नहीं करना चाहिए।

मैं मार्क सेमन के उत्तर को बढ़ाऊंगा: [System.Security.Principal.WindowsIdentity] :: GetCurrent ()। नाम।

लेकिन मुझे इसकी अनुमति नहीं है। मार्क के उत्तर के साथ, यदि आपको केवल उपयोगकर्ता नाम की आवश्यकता है, तो आपको इसे मेरे सिस्टम पर पार्स करना पड़ सकता है, यह वापस आ जाता है hostname\usernameऔर डोमेन पर मशीनों के साथ डोमेन खातों के साथ जुड़ जाता है।domain\username

मैं उपयोग नहीं करूंगा whoami.exeक्योंकि यह विंडोज के सभी संस्करणों पर मौजूद नहीं है, और यह एक अन्य बाइनरी के लिए कॉल है और कुछ सुरक्षा टीमों को फिट दे सकता है।


1
चूंकि ओपी ने विंडोज-पॉवर्सशेल के बारे में पूछा था, इसलिए यह मान्य है, लेकिन [Environment]::UserNameकम टाइपिंग, स्वतंत्र $env:usernameऔर क्रॉस-प्लेटफॉर्म के बारे में है: देखें pastebin.com/GsfR6Hrp
kfsone

12

अब वह पॉवरशेल कोर (उर्फ v6) जारी कर दिया गया है, और लोग क्रॉस-प्लेटफ़ॉर्म स्क्रिप्ट लिखना चाह सकते हैं, यहाँ बहुत से उत्तर विंडोज के अलावा किसी अन्य चीज़ पर काम नहीं करेंगे।

[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

दूसरे उपयोगकर्ता नाम केवल यदि आप कॉपी और पेस्ट करें प्रदर्शन केवल उद्देश्यों के लिए है।


$ फुलनाम = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty उपयोगकर्ता नाम $ उपयोगकर्ता नाम = $ fullname.Replace ("DOMAIN \", ") $ उपयोगकर्ता नाम
क्लेटन.निचोल्स

-1

मुझे कोई ऐड-टाइप आधारित उदाहरण नहीं दिखे । यहाँ एक सीधे GetapserName का उपयोग कर रहा है advapi32.dll से।

$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
कृपया बताएं कि यह कोड क्या कर रहा है और यह एक छोटे तरीकों की तुलना में अधिक उपयोगी क्यों होगा।
बेंजामिन हबर्ड

@BenjaminHubbard सवाल सबसे छोटी विधि के लिए नहीं पूछता है, यह पूछता है कि शक्तियों के साथ करतब कैसे पूरा करें। यह चाल को अलग-अलग करता है फिर अन्य उदाहरण dll के अंदर फ़ंक्शन को कॉल करके और .NET तक पहुंचने के लिए ऐड-टाइप विधि का उपयोग करता है।
नॉक-ड्रेगर

1
हालांकि यह एक उपन्यास कोड ब्लॉक है, यह बहुत अच्छा होगा अगर मुझे पता है कि यह क्या कर रहा था। क्या आप इसे टिप्पणियों के साथ व्याख्या कर सकते हैं, हो सकता है? धन्यवाद!
jpaugh

1
मैं लगभग उत्थान करना चाहता था, क्योंकि मैंने प्रस्ताव को योग्यता देखी। फिर भी कोड में कुछ खामियां हैं: यह एक नए नामस्थान का परिचय देता है, यह एक जादू स्थिरांक (64) का उपयोग करता है, जिसका मूल्य वह नहीं है जो चिकित्सक निर्धारित करता है ( UNLEN+1और UNLEN256 होना चाहिए ), यह किसी भी त्रुटि की अवहेलना करता है जिसे GetUserameame (के माध्यम से लौटाया जा सकता है) यह GetLastError, एक अच्छा बिंदु) को संरक्षित करता है, यह स्ट्रिंग बफर को साफ नहीं करता है; और शायद कुछ अन्य। और जैसा कि अन्य ने कहा, टिप्पणियां बहुत ही गायब हैं।
एंटोनीएल

-1

मुझे इसका उपयोग करना सबसे आसान है: cd $ home \ Desktop \

आपको वर्तमान उपयोगकर्ता डेस्कटॉप पर ले जाएगा

मेरे मामले में, मुझे पथ को बदलने के लिए स्क्रिप्ट को सक्षम करने के लिए उपयोगकर्ता नाम को पुनः प्राप्त करने की आवश्यकता थी, अर्थात। C: \ Users \% उपयोगकर्ता नाम%। मुझे उपयोगकर्ता डेस्कटॉप पर पथ बदलकर स्क्रिप्ट शुरू करने की आवश्यकता थी। मैं इसे प्राप्त करने में सक्षम था, ऊपर और कहीं और से मदद से, गेट-लोकेशन एप्लेट का उपयोग करके।

आपके पास इसे करने के लिए एक और बेहतर तरीका हो सकता है, लेकिन इसने मेरे लिए काम किया:

$ पथ = स्थान प्राप्त करें

सेट-लोकेशन $ Path \ Desktop


होम डायरेक्टरी के आधार पर कोई भी धारणा बनाना केवल बहुत विशिष्ट परिस्थितियों में काम करने के लिए बाध्य है।
राउल सालिनास-मोंटेगुडो

यदि आप एक पॉवरशेल टर्मिनल में काम कर रहे हैं और बस जल्दी से पता लगाना चाहते हैं कि आप क्या उपयोगकर्ता हैं, तो "ls ~" टाइप करके ट्रिक करना चाहिए। उपरोक्त पोस्टर की तरह, अपवाद हो सकते हैं, और यह निश्चित रूप से लिपियों के लिए अच्छा नहीं है, इसलिए उस मामले में एडौर्ड पुअर्स के उदाहरण का उपयोग करें।
MrBerta

-2

यदि आप बैच करने के लिए उपयोग किए जाते हैं, तो आप कॉल कर सकते हैं

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

यह मूल रूप से आउटपुट को चुराता है, यदि आपको एक बैच फ़ाइल मिलती है जिसमें "echo% उपयोगकर्ता नाम%" होता है।


1
मैं नीच कर रहा हूँ क्योंकि: ए) आप बहुत ही $(...)शानदार हैं: $a = cmd.exe /c echo %username%काम करता है, ख) यह पोर्टेबल नहीं है, ग) यह वास्तव में यह सवाल नहीं करता कि इसे कैसे करना है, इसे शालीनता से करना है, यह जवाब देता है कि इसे डॉस में कैसे करना है, और यह है एक आदमी को मछली पकड़ने के लिए एक पोल देने से बेहतर है कि आप उसे एक मछली दें, जैसे 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}

$ सामग्री = गेट-कंटेंट "cm.txt" ---- $ गिनती = 0 ----- फ़ॉरच ($ गिनती में $ लाइन) ---- {$ गिनती = $ गिनती + 1} ---- लिखो -होस्ट "आपके पास ये कई पंक्तियाँ हैं:" $ गिनती
अम्मी

1. $ a = $ com1, $ com2 ------ राइट-होस्ट "enter cm name" ---- $ c = readhost ----- राइट-होस्ट $ a [$ c-1] .username। , $ -43 पर एक [$ c-1] .password
ammy

$ com1 = new-object PSobject ----- $ com1 = $ com1 | ऐड-मेंबर नोटप्रॉपर्टी -नाम यूजरनेम -value 2016
ammy

1
क्या यह एक कारण है कि आप अपने स्वयं के उत्तर पर टिप्पणियों के रूप में कोड क्यों जोड़ते हैं?
aldr

1
क्यों न आप अपने उत्तर को संपादित करें और इसे टिप्पणी में विभाजित करने के बजाय कोड जोड़ें, जहां कोई इसे समझ नहीं पाएगा?
aldr

-4

मेरे मामले में, मुझे पथ को बदलने के लिए स्क्रिप्ट को सक्षम करने के लिए उपयोगकर्ता नाम को पुनः प्राप्त करने की आवश्यकता थी, अर्थात। c:\users\%username%\। मुझे उपयोगकर्ताओं के डेस्कटॉप में पथ बदलकर स्क्रिप्ट शुरू करने की आवश्यकता थी। मैं इसे प्राप्त करने में सक्षम था, ऊपर और दूसरी जगहों से, स्थान का उपयोग करके गेट एप्लेट ।

आपके पास इसे करने के लिए एक और बेहतर तरीका हो सकता है, लेकिन इसने मेरे लिए काम किया:

$Path = Get-Location

Set-Location $Path\Desktop

1
ढेर अतिप्रवाह में आपका स्वागत है ! इसके बराबर है Set-Location Desktop। ( Get-Locationकेवल वर्तमान स्थान लौटाता है, जो Set-Locationएक रिश्तेदार पथ के साथ निहित है ।)
jpaugh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.