ฉันจะรับชื่อผู้ใช้ปัจจุบันใน Windows PowerShell ได้อย่างไร
ฉันจะรับชื่อผู้ใช้ปัจจุบันใน Windows PowerShell ได้อย่างไร
คำตอบ:
เจอแล้ว:
$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 ในฟอรัมอื่นนี้ความคิดเห็นของ @Kevin Panko เกี่ยวกับคำตอบของ @Mark Seemann ด้วยการเลือกหมวดหมู่หนึ่งจากหมวดหมู่อื่น:
[วิธีการเข้าถึงโทเค็นของ Windows] เป็นคำตอบที่ปลอดภัยที่สุดเนื่องจากผู้ใช้ $ env: USERNAME สามารถเปลี่ยนแปลงได้ แต่สิ่งนี้จะไม่ถูกหลอกโดยการทำเช่นนั้น
ในระยะสั้นตัวเลือกตัวแปรสภาพแวดล้อมจะรวบรัดมากขึ้นและตัวเลือกโทเค็นการเข้าถึง Windows จะเชื่อถือได้มากขึ้น
ฉันต้องใช้วิธีโทเค็นการเข้าถึง Windows ของ @Mark Seemann ในสคริปต์ PowerShell ที่ฉันเรียกใช้จากแอปพลิเคชัน C # ด้วยการรับบทบาท
แอปพลิเคชัน C # ทำงานด้วยบัญชีผู้ใช้ของฉันและเรียกใช้สคริปต์ PowerShell เป็นบัญชีบริการ เนื่องจากข้อ จำกัด ของวิธีที่ฉันเรียกใช้สคริปต์ PowerShell จาก C # อินสแตนซ์ PowerShell ใช้ตัวแปรสภาพแวดล้อมของบัญชีผู้ใช้ของฉันแม้ว่าจะถูกเรียกใช้ในฐานะผู้ใช้บัญชีบริการ
ในการตั้งค่านี้ตัวเลือกตัวแปรสภาพแวดล้อมจะส่งคืนชื่อบัญชีของฉันและตัวเลือกโทเค็นการเข้าถึง Windows จะส่งคืนชื่อบัญชีบริการ (ซึ่งเป็นสิ่งที่ฉันต้องการ) และตัวเลือกผู้ใช้ที่ล็อกอินจะคืนชื่อบัญชีของฉัน
นอกจากนี้หากคุณต้องการเปรียบเทียบตัวเลือกด้วยตัวคุณเองนี่คือสคริปต์ที่คุณสามารถใช้เพื่อเรียกใช้สคริปต์ในฐานะผู้ใช้รายอื่น คุณจำเป็นต้องใช้ 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 ความคิดใด ๆ ที่เกิดขึ้น?
$env:username
เป็นวิธีที่ง่ายที่สุด
ฉันต้องการที่จะโยนคำสั่งwhoamiซึ่งโดยทั่วไปเป็นนามแฝงที่ดีสำหรับการทำ%USERDOMAIN%\%USERNAME%
ตามที่เสนอในคำตอบอื่น ๆ
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
ผู้ใช้สามารถเปลี่ยนแปลงได้ แต่สิ่งนี้จะไม่ถูกหลอกโดยการทำเช่นนั้น
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
เป็นปฏิบัติการ ไม่สามารถลบได้จาก PowerShell มันอาจถูกลบออกจาก Windows แต่ก็ยังคงเป็นของ Windows Server 2012 ไม่ใช่นาโน
[Environment]::UserName
ส่งคืนเฉพาะชื่อผู้ใช้ เช่นbob
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
ส่งคืนชื่อผู้ใช้นำหน้าด้วยโดเมนตามความเหมาะสม เช่นSOMEWHERENICE \ bob
ฉันได้ใช้ $env:username
มาก่อน แต่มีเพื่อนร่วมงานชี้ให้เห็นว่ามันเป็นตัวแปรสภาพแวดล้อมและผู้ใช้สามารถเปลี่ยนแปลงได้ดังนั้นหากคุณต้องการได้รับชื่อผู้ใช้ปัจจุบันคุณไม่ควรเชื่อถือ
ฉันขอคำตอบของ Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCurrent ()
แต่ฉันไม่ได้รับอนุญาต กับคำตอบมาร์คถ้าคุณต้องการเพียงชื่อผู้ใช้ที่คุณอาจจะต้องแยกมันออกมาตั้งแต่ในระบบของฉันก็จะส่งกลับและในโดเมนเครื่องร่วมกับบัญชีโดเมนก็จะกลับhostname\username
domain\username
ฉันจะไม่ใช้whoami.exe
เนื่องจากไม่มีใน Windows ทุกรุ่นและเป็นการเรียกเลขฐานสองอื่นและอาจให้ทีมรักษาความปลอดภัยบางส่วนเข้ากันได้
[Environment]::UserName
มีการพิมพ์น้อยกว่าไม่ขึ้นกับ$env:username
และข้ามแพลตฟอร์ม: ดูpastebin.com/GsfR6Hrp
ตอนนี้PowerShell Core (aka v6) เปิดตัวแล้วและผู้คนอาจต้องการเขียนสคริปต์ข้ามแพลตฟอร์มคำตอบมากมายที่นี่จะไม่ทำงานกับสิ่งอื่นนอกจาก Windows
[Environment]::UserName
ดูเหมือนจะเป็นวิธีที่ดีที่สุดในการรับชื่อผู้ใช้ปัจจุบันในทุกแพลตฟอร์มที่ได้รับการสนับสนุนโดย PowerShell Core หากคุณไม่ต้องการเพิ่มการตรวจจับแพลตฟอร์มและปลอกพิเศษในรหัสของคุณ
เพียงสร้างผลงานของผู้อื่นที่นี่:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
สอง ชื่อผู้ใช้สำหรับการแสดงผลเท่านั้นถ้าคุณคัดลอกและวาง
ฉันไม่เห็นตัวอย่างจากAdd-Typeใด ๆ นี่คือการใช้ GetUserName โดยตรงจาก 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
และUNLEN
256) มันไม่สนใจข้อผิดพลาดใด ๆ ซึ่งอาจส่งคืนจาก GetUserName (ผ่าน มันรักษา GetLastError เป็นจุดที่ดี) มันไม่ได้ทำความสะอาดบัฟเฟอร์สตริง; และอาจอื่น ๆ และอย่างที่คนอื่นพูดความเห็นก็หายไปอย่างมากเช่นกัน
ฉันพบว่าใช้งานง่ายที่สุด: cd $ home \ Desktop \
ในกรณีของฉันฉันต้องดึงชื่อผู้ใช้เพื่อเปิดใช้งานสคริปต์เพื่อเปลี่ยนเส้นทางเช่น C: \ Users \% username% ฉันต้องการเริ่มสคริปต์โดยเปลี่ยนเส้นทางไปยังเดสก์ท็อปผู้ใช้ ฉันสามารถทำได้ด้วยความช่วยเหลือจากด้านบนและที่อื่น ๆ โดยใช้แอปเพล็ต get-location
คุณอาจมีวิธีอื่นหรือดีกว่าที่จะทำ แต่วิธีนี้ใช้ได้ผลสำหรับฉัน:
$ Path = ตำแหน่งที่รับ
กำหนดตำแหน่ง $ Path \ Desktop
หากคุณคุ้นเคยกับชุดคุณสามารถโทร
$user=$(cmd.exe /c echo %username%)
สิ่งนี้จะขโมยเอาท์พุทจากสิ่งที่คุณจะได้รับหากคุณมีไฟล์แบตช์ที่มีเพียง "echo% ชื่อผู้ใช้%"
$(...)
เป็นคนที่ฟุ่มเฟือย: $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
กับทางญาติ.)
$env:username
การดึงชื่อผู้ใช้จากตัวแปรสภาพแวดล้อมที่สอดคล้องกัน