Як знайти поточного користувача в середовищі Windows?


159

Чи запускається сценарій командного рядка, чи можна отримати ім’я поточного користувача?



@PeterMortensen, я не думаю, що нитка супер пов'язана з цією. Одне стосується використання .NET, а інше - використання API cmd . Крім того, що вони обидва хочуть однакової інформації, напевно є багато інших API, які також роблять подібну річ
KyleMit

Відповіді:


202

Ви можете використовувати змінну імені користувача: %USERNAME%


90

Ім'я користувача:

echo %USERNAME%

Доменне ім'я:

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%, результат bballdave025@DESKTOP-MACHINE. Все залежить від того, що потрібно користувачеві (для нас, ОП) , тобто, якщо важлива частина домену.
bballdave025

46

Це повинно бути в %USERNAME%. Очевидно, що це може бути легко підроблено, тому не покладайтеся на це для безпеки.

Корисна порада: введіть setу командному рядку список усіх змінних середовища.


2
Ваша 'net config Workstation | знайти "Ім'я користувача" 'коментар дуже корисний. Це мала бути відповідь, а не просто коментар
Альпай

17

%USERNAME% - це правильна відповідь у пакетній та іншій обстановці Windows.

Інший варіант - використовувати, %USERPROFILE%щоб отримати шлях користувача, наприклад C:\Users\username.


6

Відповідь залежить від того, на якій мові "скрипту командного рядка" ви перебуваєте.

См

У старому cmd.exeкомандному рядку або в a .batабо .cmdскрипті ви можете використовувати наступне:

%USERNAME% - Отримує лише ім’я користувача.

%USERDOMAIN% - Отримує домен користувача.

PowerShell

У командному рядку PowerShell або a .ps1або .psm1скрипті ви можете використовувати наступне:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name- дає вам повноцінне ім'я користувача (наприклад, Домен \ Ім'я користувача). Це також найбезпечніший метод, оскільки його неможливо перекрити користувачем, як інші $Envзмінні нижче.

$Env:Username - Отримує лише ім’я користувача.

$Env:UserDomain - Отримує домен користувача.

$Env:ComputerName - Отримує назву комп’ютера.


Це чудова відповідь, оскільки це питання залежить від оболонки. Є багато оболонок, які можна використовувати в Windows. Не тільки CMD. У наші дні більшість людей переїхали до пансіонату, а там є й інші. 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 , не має деякі з найбільш корисних маленьких сценаріїв утиліт Unix, таких , як хто / Whoami , SED і AWK . У будь-якому випадку, якщо ви хочете чогось безглуздого, візьміть Visual Studio Express і складіть наступне:

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

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

І просто використовуйте це у своєму пакетному файлі.


Так, добре було б мати вбудований.
Гео

8
Я погоджуюся, що sed & awk було б корисно, але це дає вам 50% шляху туди: net config Workstation | find "User name"
the_mandrill

9
whoamiдоступний починаючи з Windows Vista.
Joey

2
Щоправда, утиліта whoami включена до Vista. Для XP це в інструментах підтримки SP2, а для W2K - у наборі інструментів Resource.
RealHowTo

4

У більшості випадків змінна% USERNAME% буде тим, що ви хочете.

echo %USERNAME%

Однак якщо у вас підвищена оболонка cmd,% 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"] повертає рядок, що містить власника процесу Explorerr.exe, з адаптованим регулярним виразом можна отримати необхідний значення. Це також ідеально працює під Windows 7.

У рідкісних випадках explorer.exe замінюється іншою програмою, фільтр пошуку може бути адаптований відповідно до цього випадку. Якщо команда повертає порожній рядок, то ймовірно, що жоден користувач не входить у систему. У Windows 7 також можна запустити [сеанс запиту | знайти ">"].


0

Наскільки найкращим є відповідь BlueBearr (поки я запускаю пакетний сценарій, наприклад. SYSTEM права), я мушу щось до нього додати. Тому що в моїй версії мови 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.