คุณจะค้นหาผู้ใช้ปัจจุบันในสภาพแวดล้อม Windows ได้อย่างไร


159

เมื่อเรียกใช้สคริปต์บรรทัดคำสั่งเป็นไปได้หรือไม่ที่จะได้รับชื่อผู้ใช้ปัจจุบัน?



@PeterMortensen ฉันไม่คิดว่าหัวข้อนั้นเกี่ยวข้องกับรายการนี้มากนัก หนึ่งคือเกี่ยวกับการใช้. NETและอื่น ๆ เกี่ยวกับการใช้cmd API นอกเหนือจากข้อเท็จจริงที่ว่าพวกเขาทั้งสองต้องการข้อมูลเดียวกันมี API อื่น ๆ มากมายที่ทำสิ่งเดียวกัน
KyleMit

คำตอบ:



90

ชื่อผู้ใช้:

echo %USERNAME%

Domainname:

echo %USERDOMAIN%

คุณสามารถรับรายการตัวแปรสภาพแวดล้อมทั้งหมดได้โดยการรันคำสั่งsetจากพรอมต์คำสั่ง


ข้อมูลเพิ่มเติมพร้อมตัวแปรสภาพแวดล้อมทั้งหมดทำให้นี่เป็นคำตอบที่ยอดเยี่ยมมาก
bballdave025

63

เพียงใช้คำสั่งนี้ในพร้อมท์คำสั่ง

C:\> whoami

นี่เป็นคำตอบที่ดี แต่มีข้อแม้อยู่บ้าง ถ้าผมใส่ฉันได้รับwhoami desktop-machine\bballdave025มีสองส่วนคือมองผ่าน: 1) echo %USERNAME%ผลbballdave025; 2) ผลecho %USERDOMAIN% DESKTOP-MACHINEผมคิดว่าใครจะบอกว่า 'ชื่อผู้ใช้สมบูรณ์' สามารถใช้ได้ผ่านทางecho %USERDOMAIN%\%USERNAME%(ผลนี้DESKTOP-MACHINE\bballdave025ตรงกับที่whoamiกรณีละเว้น) หรือแม้กระทั่งผ่านทางผลecho %USERNAME%@%USERDOMAIN% ทุกอย่างขึ้นอยู่กับความต้องการของผู้ใช้ (สำหรับเรา OP)เช่นถ้าส่วนโดเมนมีความสำคัญ bballdave025@DESKTOP-MACHINE
bballdave025

46

มันควรจะเป็น%USERNAME%มา เห็นได้ชัดว่านี่สามารถปลอมแปลงได้ง่ายดังนั้นอย่าพึ่งพาเพื่อความปลอดภัย

เคล็ดลับที่มีประโยชน์: พิมพ์setในพรอมต์คำสั่งจะแสดงตัวแปรสภาพแวดล้อมทั้งหมด


2
'net config Workstation | ค้นหาความคิดเห็น "ชื่อผู้ใช้" 'มีประโยชน์มาก มันควรจะได้รับคำตอบมากกว่าแค่แสดงความคิดเห็น
ไต

17

%USERNAME% เป็นคำตอบที่ถูกต้องในชุดและอื่น ๆ ในสภาพแวดล้อม Windows

อีกตัวเลือกหนึ่งคือการใช้เพื่อให้ได้เส้นทางของผู้ใช้เช่น%USERPROFILE%C:\Users\username


6

คำตอบขึ้นอยู่กับภาษา "command-line script" ที่คุณใช้

cmd

ในcmd.exeพรอมต์คำสั่งเก่าหรือใน.batหรือ.cmdสคริปต์คุณสามารถใช้ต่อไปนี้:

%USERNAME% - รับเพียงชื่อผู้ใช้

%USERDOMAIN% - รับโดเมนของผู้ใช้

PowerShell

ในพรอมต์คำสั่ง PowerShell .ps1หรือ.psm1สคริปต์หรือคุณสามารถใช้ต่อไปนี้:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name- ให้ชื่อผู้ใช้ที่มีคุณสมบัติครบถ้วน (เช่น Domain \ Username) นี่เป็นวิธีที่ปลอดภัยที่สุดเพราะผู้ใช้ไม่สามารถเขียนทับเช่น$Envตัวแปรอื่น ๆด้านล่าง

$Env:Username - รับเพียงชื่อผู้ใช้

$Env:UserDomain - รับโดเมนของผู้ใช้

$Env:ComputerName - รับชื่อคอมพิวเตอร์


นี่เป็นคำตอบที่ดีเพราะคำถามนี้ขึ้นอยู่กับ 'เชลล์' มีเชลล์มากมายที่คุณสามารถใช้กับ Windows ไม่ใช่แค่ CMD วันนี้คนส่วนใหญ่ได้ย้ายไปที่ PowerShell และมีคนอื่นออกมี stackoverflow.com/questions/17349022/…
G_Style

5

% USERNAME% จะได้รับชื่อผู้ใช้ของกระบวนการที่กำลังทำงานอยู่ ขึ้นอยู่กับว่าคุณใช้ไฟล์แบตช์ของคุณอย่างไรไม่จำเป็นต้องเหมือนกับชื่อของผู้ใช้ปัจจุบัน ตัวอย่างเช่นคุณอาจเรียกใช้แบตช์ไฟล์ของคุณผ่านงานที่กำหนดเวลาไว้จากบริการ ฯลฯ

นี่คือวิธีที่แน่นอนยิ่งขึ้นในการรับชื่อผู้ใช้ของผู้ใช้ที่เข้าสู่ระบบในปัจจุบันโดยการขูดชื่อผู้ใช้ที่เริ่มงาน explorer.exe:

for /f "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do if /i "%%a %%b"=="User Name:" set _currdomain_user=%%c
for /f "TOKENS=1,2 DELIMS=\" %%a in ("%_currdomain_user%") do set _currdomain=%%a & set _curruser=%%b

4

ฉันใช้วิธีนี้ในการเขียนไฟล์แบตช์สำหรับการทดสอบ

echo %userdomain%\%username%

เนื่องจากคุณต้องใส่รหัสผ่านเป็นข้อความธรรมดาหากจำเป็นต้องมีการตรวจสอบสิทธิ์ฉันจะใช้ในสภาพแวดล้อมส่วนตัวโดยสมบูรณ์ซึ่งผู้ใช้รายอื่นไม่สามารถดูได้หรือหากผู้ใช้เห็นรหัสผ่านจะไม่มีผลกระทบใด ๆ

หวังว่านี่จะช่วยให้ใครบางคนออกมา


4

มันรำคาญเสมอฉันว่า Windows ไม่ได้มีบางส่วนของสาธารณูปโภคสคริปต์เล็ก ๆ น้อย ๆ ที่มีประโยชน์มากขึ้นของระบบปฏิบัติการยูนิกซ์เช่นที่ / whoami , sedและAWK อย่างไรก็ตามหากคุณต้องการสิ่งที่ไม่อาจป้องกันได้ให้รับ Visual Studio Express และรวบรวมสิ่งต่อไปนี้:

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv) {
    printf("%s", GetUserName());
}

และใช้มันในไฟล์แบทช์ของคุณ


ใช่มันคงจะดีถ้ามี built-in
Geo

8
ผมยอมรับว่า sed และ awk จะเป็นประโยชน์ แต่เรื่องนี้ทำให้คุณได้รับ 50% ของทางมี: net config Workstation | find "User name"
the_mandrill

9
whoamiสามารถเริ่มต้นด้วย Windows Vista
Joey

2
True สาธารณูปโภค whoami รวมอยู่ใน Vista สำหรับ XP มันอยู่ในเครื่องมือสนับสนุน SP2 และสำหรับ W2K มันอยู่ในชุดเครื่องมือทรัพยากร
RealHowTo

4

ในกรณีส่วนใหญ่ตัวแปร% USERNAME% จะเป็นสิ่งที่คุณต้องการ

echo %USERNAME%

อย่างไรก็ตามหากคุณใช้งาน cmd shell แล้ว% USERNAME% จะรายงานชื่อผู้ดูแลระบบแทนชื่อผู้ใช้ของคุณเอง หากคุณต้องการทราบหลังเรียกใช้:

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u

1

นี่คือความแตกต่างหลักระหว่างตัวแปรชื่อผู้ใช้และคำสั่ง whoami:

C:\Users\user.name>echo %username%
user.name

C:\Users\user.name>whoami
domain\user.name

DOMAIN = bios name of the domain (not fqdn)

0

ในบริบทมาตรฐานผู้ใช้ที่เชื่อมต่อแต่ละรายจะมีกระบวนการ explorer.exe: คำสั่ง [tasklist / V | find "explorer"] ส่งคืนบรรทัดที่มีเจ้าของกระบวนการ explorer.exe ด้วย regex ที่ปรับแล้วซึ่งเป็นไปได้ที่จะได้รับสิ่งที่ต้องการ ความคุ้มค่า สิ่งนี้ยังทำงานได้อย่างสมบูรณ์แบบใน Windows 7

ในกรณีที่หายาก explorer.exe จะถูกแทนที่ด้วยโปรแกรมอื่นตัวกรองการค้นหาสามารถปรับให้ตรงกับกรณีนี้ หากคำสั่งส่งคืนบรรทัดว่างอาจเป็นไปได้ว่าไม่มีผู้ใช้ใด ๆ ด้วย Windows 7 คุณสามารถเรียกใช้ [session session | find ">"] ได้


0

เท่าที่พบว่า BlueBearr ตอบสนองได้ดีที่สุด (ในขณะที่ฉันรันสคริปต์แบทช์ด้วยสิทธิของระบบเช่น) ฉันต้องเพิ่มบางสิ่งลงไป เพราะในบรรทัดเวอร์ชันภาษา Windows ของฉัน (โปแลนด์) ที่จะต้องถูกจับโดย "%% a %% b" == "ชื่อผู้ใช้:" ได้รับการสรุปที่แท้จริง (มันมีอักขระที่ออกเสียงในภาษาของฉัน) ฉันข้าม 7 บรรทัดแรกและ ทำงานในวันที่ 8

@for /f "SKIP= 7 TOKENS=3,4 DELIMS=\ " %%G in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do @IF %%G==%COMPUTERNAME% set _currdomain_user=%%H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.