Làm thế nào để bạn tìm thấy người dùng hiện tại trong môi trường Windows?


159

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?



@PeterMortensen, tôi không nghĩ rằng chủ đề này siêu liên quan đến cái này. Một là về việc sử dụng .NET và một là về việc sử dụng API cmd . Khác với thực tế là cả hai đều muốn có cùng thông tin, chắc chắn có hàng tấn API khác cũng làm điều tương tự
KyleMit

Câu trả lời:


202

Bạn có thể sử dụng biến tên người dùng: %USERNAME%


90

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 settừ dấu nhắc lệnh.


Các thông tin bổ sung với tất cả các biến môi trường làm cho đây là một câu trả lời mở rộng tuyệt vời.
bballdave025

63

Chỉ cần sử dụng lệnh này trong dấu nhắc lệnh

C:\> whoami

Đây là một câu trả lời tốt, nhưng có một số hãy cẩn thận. Nếu tôi vào 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 whoamitrườ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.
bballdave025

46

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õ setvào dấu nhắc lệnh sẽ liệt kê tất cả các biến môi trường.


2
Máy trạm cấu hình mạng của bạn | tìm "Tên người dùng" 'bình luận rất hữu ích. Nó đáng lẽ phải là một câu trả lời thay vì chỉ là một bình luận
Alpay

17

%USERNAME% là câu trả lời đúng trong lô và khác trong môi trường Windows.

Một tùy chọn khác là sử dụng %USERPROFILE%để có được đường dẫn của người dùng, như thế nào C:\Users\username.


6

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.

Cmd

Trong cmd.exedấu nhắc lệnh cũ hoặc trong tập lệnh .bathoặc .cmdtậ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.

PowerShell

Trong dấu nhắc lệnh PowerShell .ps1hoặc .psm1tậ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 $Envbiế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.


Đây là một câu trả lời tuyệt vời vì câu hỏi này phụ thuộc vào 'vỏ'. Có nhiều shell bạn có thể sử dụng với Windows. Không chỉ là CMD. Ngày nay, hầu hết mọi người đã chuyển đến powershell và có những người khác ở ngoài đó. stackoverflow.com/questions/17349022/
Mạnh

5

% 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

4

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.


4

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 , sedAWK . 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.


Vâng, thật tuyệt khi được tích hợp sẵn.
Geo

8
Tôi đồng ý rằng sed & awk sẽ hữu ích, nhưng điều này giúp bạn đạt được 50% trong số đó: net config Workstation | find "User name"
the_mandrill

9
whoamicó sẵn bắt đầu với Windows Vista.
Joey

2
Đúng, tiện ích whoami được bao gồm trong Vista. Đối với XP, nó nằm trong các công cụ Hỗ trợ SP2 và cho W2K, nó nằm trong bộ công cụ Tài nguyên.
RealHowTo

4

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

1

Đâ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)

0

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 ">"].


0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.