मुझे Windows PowerShell में वर्तमान उपयोगकर्ता नाम कैसे मिलेगा?
मुझे Windows PowerShell में वर्तमान उपयोगकर्ता नाम कैसे मिलेगा?
जवाबों:
मुझे यह मिला:
$env:UserName
वहाँ भी:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAMEउपयोगकर्ता द्वारा बदल दिया जा सकता है, लेकिन ऐसा करने से यह मूर्खतापूर्ण नहीं होगा।
मैंने सोचा कि दिए गए उत्तरों को संक्षेप में प्रस्तुत करना और तुलना करना मूल्यवान होगा।
(आसान / छोटा / यादगार विकल्प)
[Environment]::UserName - @ThomasBratt$env:username - @ इयॉनwhoami - @ कलक्टर(अधिक भरोसेमंद विकल्प)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @ मर्कसिमन्न(PowerShell उदाहरण चलाने वाले उपयोगकर्ता के नाम के बजाय)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username- @TwonOfAn इस अन्य मंच पर@ केविन पान्को की टिप्पणी @ मर्क सेमन के जवाब पर एक के बाद एक श्रेणियों को चुनने के बारे में है:
[विंडोज एक्सेस टोकन दृष्टिकोण] सबसे सुरक्षित जवाब है, क्योंकि $ 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"
[Environment]::UserNameसबसे अच्छा विकल्प है, क्योंकि यह क्रॉस प्लेटफॉर्म पर काम करता है। whoamiकाम करने के लिए भी लगता है, लेकिन whoamiप्लेटफॉर्म पर उपलब्ध उपकरण पर निर्भर करता है।
$env:USERNAMEउत्पादन करता है SYSTEM, जबकि [Environment]::UserName]मेरे उपयोगकर्ता नाम को किसी भी तरह से पैदावार देता है।
Get-WmiObjectविधि की तरह लगता है अब pwsh में काम नहीं करता है। यहां तक कि संगतता मॉड्यूल को आयात करने की कोशिश की गई और Microsoft.PowerShell.Managementजिसमें cmdlet है। किसी भी विचार क्या हो रहा है?
मैं हूमी कमांड में फेंकना चाहता हूं , जो मूल %USERDOMAIN%\%USERNAME%रूप से अन्य उत्तरों में प्रस्तावित के रूप में करने के लिए एक अच्छा उपनाम है।
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAMEउपयोगकर्ता द्वारा बदला जा सकता है, लेकिन ऐसा करने से यह मूर्ख नहीं होगा।
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
whoamiएक निष्पादन योग्य है। इसे PowerShell से हटाया नहीं जा सकता है। इसे संभवतः विंडोज से हटाया जा सकता है, लेकिन यह अभी भी गैर-नैनो विंडोज सर्वर 2012 के रूप में है।
[Environment]::UserNameकेवल उपयोगकर्ता नाम लौटाता है। उदाहरण के लिए, बॉब
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name अपने डोमेन द्वारा उपसर्गित उपयोगकर्ता नाम लौटाता है, जहाँ उपयुक्त हो। जैसे SOMEWHERENICE \ bob
मैंने उपयोग कर लिया है $env:username अतीत में है, लेकिन एक सहयोगी ने बताया कि यह एक पर्यावरण चर है और इसे उपयोगकर्ता द्वारा बदला जा सकता है और इसलिए, यदि आप वास्तव में वर्तमान उपयोगकर्ता का उपयोगकर्ता नाम प्राप्त करना चाहते हैं, तो आपको इस पर भरोसा नहीं करना चाहिए।
मैं मार्क सेमन के उत्तर को बढ़ाऊंगा: [System.Security.Principal.WindowsIdentity] :: GetCurrent ()। नाम।
लेकिन मुझे इसकी अनुमति नहीं है। मार्क के उत्तर के साथ, यदि आपको केवल उपयोगकर्ता नाम की आवश्यकता है, तो आपको इसे मेरे सिस्टम पर पार्स करना पड़ सकता है, यह वापस आ जाता है hostname\usernameऔर डोमेन पर मशीनों के साथ डोमेन खातों के साथ जुड़ जाता है।domain\username ।
मैं उपयोग नहीं करूंगा whoami.exeक्योंकि यह विंडोज के सभी संस्करणों पर मौजूद नहीं है, और यह एक अन्य बाइनरी के लिए कॉल है और कुछ सुरक्षा टीमों को फिट दे सकता है।
[Environment]::UserNameकम टाइपिंग, स्वतंत्र $env:usernameऔर क्रॉस-प्लेटफॉर्म के बारे में है: देखें pastebin.com/GsfR6Hrp
अब वह पॉवरशेल कोर (उर्फ v6) जारी कर दिया गया है, और लोग क्रॉस-प्लेटफ़ॉर्म स्क्रिप्ट लिखना चाह सकते हैं, यहाँ बहुत से उत्तर विंडोज के अलावा किसी अन्य चीज़ पर काम नहीं करेंगे।
[Environment]::UserName यदि आप अपने कोड में प्लेटफ़ॉर्म डिटेक्शन और विशेष आवरण जोड़ना नहीं चाहते हैं, तो PowerShell Core द्वारा समर्थित सभी प्लेटफार्मों पर वर्तमान उपयोगकर्ता नाम प्राप्त करने का सबसे अच्छा तरीका प्रतीत होता है।
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
दूसरे उपयोगकर्ता नाम केवल यदि आप कॉपी और पेस्ट करें प्रदर्शन केवल उद्देश्यों के लिए है।
मुझे कोई ऐड-टाइप आधारित उदाहरण नहीं दिखे । यहाँ एक सीधे 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()
UNLEN+1और UNLEN256 होना चाहिए ), यह किसी भी त्रुटि की अवहेलना करता है जिसे GetUserameame (के माध्यम से लौटाया जा सकता है) यह GetLastError, एक अच्छा बिंदु) को संरक्षित करता है, यह स्ट्रिंग बफर को साफ नहीं करता है; और शायद कुछ अन्य। और जैसा कि अन्य ने कहा, टिप्पणियां बहुत ही गायब हैं।
मुझे इसका उपयोग करना सबसे आसान है: cd $ home \ Desktop \
मेरे मामले में, मुझे पथ को बदलने के लिए स्क्रिप्ट को सक्षम करने के लिए उपयोगकर्ता नाम को पुनः प्राप्त करने की आवश्यकता थी, अर्थात। C: \ Users \% उपयोगकर्ता नाम%। मुझे उपयोगकर्ता डेस्कटॉप पर पथ बदलकर स्क्रिप्ट शुरू करने की आवश्यकता थी। मैं इसे प्राप्त करने में सक्षम था, ऊपर और कहीं और से मदद से, गेट-लोकेशन एप्लेट का उपयोग करके।
आपके पास इसे करने के लिए एक और बेहतर तरीका हो सकता है, लेकिन इसने मेरे लिए काम किया:
$ पथ = स्थान प्राप्त करें
सेट-लोकेशन $ Path \ Desktop
यदि आप बैच करने के लिए उपयोग किए जाते हैं, तो आप कॉल कर सकते हैं
$user=$(cmd.exe /c echo %username%)
यह मूल रूप से आउटपुट को चुराता है, यदि आपको एक बैच फ़ाइल मिलती है जिसमें "echo% उपयोगकर्ता नाम%" होता है।
$(...)शानदार हैं: $a = cmd.exe /c echo %username%काम करता है, ख) यह पोर्टेबल नहीं है, ग) यह वास्तव में यह सवाल नहीं करता कि इसे कैसे करना है, इसे शालीनता से करना है, यह जवाब देता है कि इसे डॉस में कैसे करना है, और यह है एक आदमी को मछली पकड़ने के लिए एक पोल देने से बेहतर है कि आप उसे एक मछली दें, जैसे 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%\। मुझे उपयोगकर्ताओं के डेस्कटॉप में पथ बदलकर स्क्रिप्ट शुरू करने की आवश्यकता थी। मैं इसे प्राप्त करने में सक्षम था, ऊपर और दूसरी जगहों से, स्थान का उपयोग करके गेट एप्लेट ।
आपके पास इसे करने के लिए एक और बेहतर तरीका हो सकता है, लेकिन इसने मेरे लिए काम किया:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop। ( Get-Locationकेवल वर्तमान स्थान लौटाता है, जो Set-Locationएक रिश्तेदार पथ के साथ निहित है ।)
$env:usernameइसी पर्यावरण चर से उपयोगकर्ता नाम को पुनः प्राप्त करना होगा ।