Чи запускається сценарій командного рядка, чи можна отримати ім’я поточного користувача?
Чи запускається сценарій командного рядка, чи можна отримати ім’я поточного користувача?
Відповіді:
Ім'я користувача:
echo %USERNAME%
Доменне ім'я:
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%
, результат bballdave025@DESKTOP-MACHINE
. Все залежить від того, що потрібно користувачеві (для нас, ОП) , тобто, якщо важлива частина домену.
Це повинно бути в %USERNAME%
. Очевидно, що це може бути легко підроблено, тому не покладайтеся на це для безпеки.
Корисна порада: введіть set
у командному рядку список усіх змінних середовища.
Відповідь залежить від того, на якій мові "скрипту командного рядка" ви перебуваєте.
У старому cmd.exe
командному рядку або в a .bat
або .cmd
скрипті ви можете використовувати наступне:
%USERNAME%
- Отримує лише ім’я користувача.
%USERDOMAIN%
- Отримує домен користувача.
У командному рядку PowerShell або a .ps1
або .psm1
скрипті ви можете використовувати наступне:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- дає вам повноцінне ім'я користувача (наприклад, Домен \ Ім'я користувача). Це також найбезпечніший метод, оскільки його неможливо перекрити користувачем, як інші $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 , не має деякі з найбільш корисних маленьких сценаріїв утиліт Unix, таких , як хто / 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,% 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"] повертає рядок, що містить власника процесу Explorerr.exe, з адаптованим регулярним виразом можна отримати необхідний значення. Це також ідеально працює під Windows 7.
У рідкісних випадках explorer.exe замінюється іншою програмою, фільтр пошуку може бути адаптований відповідно до цього випадку. Якщо команда повертає порожній рядок, то ймовірно, що жоден користувач не входить у систему. У Windows 7 також можна запустити [сеанс запиту | знайти ">"].
Наскільки найкращим є відповідь 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