เมื่อเรียกใช้สคริปต์บรรทัดคำสั่งเป็นไปได้หรือไม่ที่จะได้รับชื่อผู้ใช้ปัจจุบัน?
เมื่อเรียกใช้สคริปต์บรรทัดคำสั่งเป็นไปได้หรือไม่ที่จะได้รับชื่อผู้ใช้ปัจจุบัน?
คำตอบ:
คุณสามารถใช้ตัวแปรชื่อผู้ใช้: %USERNAME%
ชื่อผู้ใช้:
echo %USERNAME%
Domainname:
echo %USERDOMAIN%
คุณสามารถรับรายการตัวแปรสภาพแวดล้อมทั้งหมดได้โดยการรันคำสั่งset
จากพรอมต์คำสั่ง
เพียงใช้คำสั่งนี้ในพร้อมท์คำสั่ง
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
มันควรจะเป็น%USERNAME%
มา เห็นได้ชัดว่านี่สามารถปลอมแปลงได้ง่ายดังนั้นอย่าพึ่งพาเพื่อความปลอดภัย
เคล็ดลับที่มีประโยชน์: พิมพ์set
ในพรอมต์คำสั่งจะแสดงตัวแปรสภาพแวดล้อมทั้งหมด
%USERNAME%
เป็นคำตอบที่ถูกต้องในชุดและอื่น ๆ ในสภาพแวดล้อม Windows
อีกตัวเลือกหนึ่งคือการใช้เพื่อให้ได้เส้นทางของผู้ใช้เช่น%USERPROFILE%
C:\Users\username
คำตอบขึ้นอยู่กับภาษา "command-line script" ที่คุณใช้
ในcmd.exe
พรอมต์คำสั่งเก่าหรือใน.bat
หรือ.cmd
สคริปต์คุณสามารถใช้ต่อไปนี้:
%USERNAME%
- รับเพียงชื่อผู้ใช้
%USERDOMAIN%
- รับโดเมนของผู้ใช้
ในพรอมต์คำสั่ง PowerShell .ps1
หรือ.psm1
สคริปต์หรือคุณสามารถใช้ต่อไปนี้:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- ให้ชื่อผู้ใช้ที่มีคุณสมบัติครบถ้วน (เช่น Domain \ Username) นี่เป็นวิธีที่ปลอดภัยที่สุดเพราะผู้ใช้ไม่สามารถเขียนทับเช่น$Env
ตัวแปรอื่น ๆด้านล่าง
$Env:Username
- รับเพียงชื่อผู้ใช้
$Env:UserDomain
- รับโดเมนของผู้ใช้
$Env:ComputerName
- รับชื่อคอมพิวเตอร์
% 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
ฉันใช้วิธีนี้ในการเขียนไฟล์แบตช์สำหรับการทดสอบ
echo %userdomain%\%username%
เนื่องจากคุณต้องใส่รหัสผ่านเป็นข้อความธรรมดาหากจำเป็นต้องมีการตรวจสอบสิทธิ์ฉันจะใช้ในสภาพแวดล้อมส่วนตัวโดยสมบูรณ์ซึ่งผู้ใช้รายอื่นไม่สามารถดูได้หรือหากผู้ใช้เห็นรหัสผ่านจะไม่มีผลกระทบใด ๆ
หวังว่านี่จะช่วยให้ใครบางคนออกมา
มันรำคาญเสมอฉันว่า Windows ไม่ได้มีบางส่วนของสาธารณูปโภคสคริปต์เล็ก ๆ น้อย ๆ ที่มีประโยชน์มากขึ้นของระบบปฏิบัติการยูนิกซ์เช่นที่ / whoami , sedและAWK อย่างไรก็ตามหากคุณต้องการสิ่งที่ไม่อาจป้องกันได้ให้รับ Visual Studio Express และรวบรวมสิ่งต่อไปนี้:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
และใช้มันในไฟล์แบทช์ของคุณ
net config Workstation | find "User name"
whoami
สามารถเริ่มต้นด้วย Windows Vista
ในกรณีส่วนใหญ่ตัวแปร% USERNAME% จะเป็นสิ่งที่คุณต้องการ
echo %USERNAME%
อย่างไรก็ตามหากคุณใช้งาน cmd shell แล้ว% USERNAME% จะรายงานชื่อผู้ดูแลระบบแทนชื่อผู้ใช้ของคุณเอง หากคุณต้องการทราบหลังเรียกใช้:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
นี่คือความแตกต่างหลักระหว่างตัวแปรชื่อผู้ใช้และคำสั่ง 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)
ในบริบทมาตรฐานผู้ใช้ที่เชื่อมต่อแต่ละรายจะมีกระบวนการ explorer.exe: คำสั่ง [tasklist / V | find "explorer"] ส่งคืนบรรทัดที่มีเจ้าของกระบวนการ explorer.exe ด้วย regex ที่ปรับแล้วซึ่งเป็นไปได้ที่จะได้รับสิ่งที่ต้องการ ความคุ้มค่า สิ่งนี้ยังทำงานได้อย่างสมบูรณ์แบบใน Windows 7
ในกรณีที่หายาก explorer.exe จะถูกแทนที่ด้วยโปรแกรมอื่นตัวกรองการค้นหาสามารถปรับให้ตรงกับกรณีนี้ หากคำสั่งส่งคืนบรรทัดว่างอาจเป็นไปได้ว่าไม่มีผู้ใช้ใด ๆ ด้วย Windows 7 คุณสามารถเรียกใช้ [session session | find ">"] ได้
เท่าที่พบว่า 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