Khi chạy tập lệnh dòng lệnh, có thể lấy tên của người dùng hiện tại không?
Khi chạy tập lệnh dòng lệnh, có thể lấy tên của người dùng hiện tại không?
Câu trả lời:
Tên tài khoản:
echo %USERNAME%
Tên miền:
echo %USERDOMAIN%
Bạn có thể nhận được một danh sách đầy đủ các biến môi trường bằng cách chạy lệnh set
từ dấu nhắc lệnh.
Chỉ cần sử dụng lệnh này trong dấu nhắc lệnh
C:\> whoami
whoami
, tôi nhận được desktop-machine\bballdave025
. Có hai phần, xem qua: 1) echo %USERNAME%
, kết quả bballdave025
; 2) echo %USERDOMAIN%
, kết quả DESKTOP-MACHINE
. Tôi đoán người ta có thể nói 'tên người dùng đầy đủ' có sẵn thông qua echo %USERDOMAIN%\%USERNAME%
(kết quả này DESKTOP-MACHINE\bballdave025
, khớp với whoami
trường hợp, bỏ qua trường hợp), hoặc thậm chí qua echo %USERNAME%@%USERDOMAIN%
, kết quả bballdave025@DESKTOP-MACHINE
. Tất cả phụ thuộc vào những gì người dùng (đối với chúng tôi, OP) cần , tức là nếu phần tên miền quan trọng.
Nó nên ở trong %USERNAME%
. Rõ ràng điều này có thể dễ dàng bị giả mạo, vì vậy đừng dựa vào nó để bảo mật.
Mẹo hữu ích: gõ set
vào dấu nhắc lệnh sẽ liệt kê tất cả các biến môi trường.
Câu trả lời phụ thuộc vào ngôn ngữ "tập lệnh dòng lệnh" mà bạn đang sử dụng.
Trong cmd.exe
dấu nhắc lệnh cũ hoặc trong tập lệnh .bat
hoặc .cmd
tập lệnh, bạn có thể sử dụng như sau:
%USERNAME%
- Chỉ nhận được tên người dùng.
%USERDOMAIN%
- Lấy tên miền của người dùng.
Trong dấu nhắc lệnh PowerShell .ps1
hoặc .psm1
tập lệnh hoặc tập lệnh, bạn có thể sử dụng như sau:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- Cung cấp cho bạn tên người dùng đủ điều kiện (ví dụ: Tên miền \ Tên người dùng). Đây cũng là phương pháp an toàn nhất vì người dùng không thể bị ghi đè như các $Env
biến khác bên dưới.
$Env:Username
- Chỉ nhận được tên người dùng.
$Env:UserDomain
- Lấy tên miền của người dùng.
$Env:ComputerName
- Lấy tên của máy tính.
% USERNAME% sẽ giúp bạn có tên người dùng của quy trình hiện đang chạy. Tùy thuộc vào cách bạn đang chạy tệp bó của mình, đây không nhất thiết phải giống với tên của người dùng hiện tại. Ví dụ: bạn có thể đang chạy tệp bó của mình thông qua tác vụ theo lịch trình, từ một dịch vụ, v.v.
Dưới đây là một cách chắc chắn hơn để có được tên người dùng của người dùng hiện đang đăng nhập bằng cách xóa tên người dùng đã bắt đầu tác vụ 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
Tôi sử dụng phương pháp này trong việc viết các tệp bó để kiểm tra.
echo %userdomain%\%username%
Vì bạn phải bao gồm mật khẩu trong văn bản thuần nếu yêu cầu xác thực, tôi sẽ chỉ sử dụng nó trong một môi trường hoàn toàn riêng tư nơi người dùng khác không thể xem nó hoặc nếu người dùng nhìn thấy mật khẩu sẽ không phải chịu hậu quả.
Mong rằng nó giúp ai đó thoát.
Tôi luôn cảm thấy khó chịu khi Windows không có một số tiện ích kịch bản nhỏ hữu ích hơn của Unix, như who / whoami , sed và AWK . Dù sao, nếu bạn muốn thứ gì đó hoàn hảo, hãy lấy Visual Studio Express và biên dịch như sau:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
Và chỉ cần sử dụng nó trong tập tin hàng loạt của bạn.
net config Workstation | find "User name"
whoami
có sẵn bắt đầu với Windows Vista.
Trong hầu hết các trường hợp, biến% USERNAME% sẽ là những gì bạn muốn.
echo %USERNAME%
Tuy nhiên, nếu bạn đang chạy trình bao cmd nâng cao, thì% USERNAME% sẽ báo cáo tên quản trị viên thay vì tên người dùng của riêng bạn. Nếu bạn muốn biết cái sau, hãy chạy:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
Đây là sự khác biệt chính giữa biến tên người dùng và lệnh 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)
Trong ngữ cảnh chuẩn, mỗi người dùng được kết nối giữ một quy trình explorer.exe: Lệnh [tasklist / V | find "explorer"] trả về một dòng có chứa chủ sở hữu quy trình explorer.exe, với regex thích nghi, có thể nhận được yêu cầu giá trị. Điều này cũng chạy hoàn hảo trong Windows 7.
Trong các trường hợp hiếm hoi explorer.exe được thay thế bởi một chương trình khác, bộ lọc find có thể được điều chỉnh để phù hợp với trường hợp này. Nếu lệnh trả về một dòng trống thì có khả năng không có người dùng nào đăng nhập. Với Windows 7, bạn cũng có thể chạy [phiên truy vấn | find ">"].
Theo như BlueBearr phản hồi tốt nhất (trong khi tôi, tôi đang chạy tập lệnh bó của mình với ví dụ: quyền HỆ THỐNG) thì tôi phải thêm một cái gì đó vào nó. Bởi vì trong dòng phiên bản ngôn ngữ Windows (tiếng Ba Lan) của tôi sẽ bị bắt bởi "%% a %% b" == "Tên người dùng:" được THỰC SỰ HOÀN THÀNH (nó chứa một số ký tự dấu phụ trong ngôn ngữ của tôi) Tôi bỏ qua 7 dòng đầu tiên và Hoạt động vào ngày 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