Bir komut satırı komut dosyası çalıştırırken, geçerli kullanıcının adını almak mümkün müdür?
Bir komut satırı komut dosyası çalıştırırken, geçerli kullanıcının adını almak mümkün müdür?
Yanıtlar:
Kullanıcı adı:
echo %USERNAME%
Alan adı:
echo %USERDOMAIN%
set
Komut isteminden komutu çalıştırarak ortam değişkenlerinin tam listesini alabilirsiniz .
Komut isteminde bu komutu kullanın
C:\> whoami
whoami
, anlarım desktop-machine\bballdave025
. İki bölüm vardır: 1) echo %USERNAME%
, sonuç bballdave025
; 2) echo %USERDOMAIN%
, sonuç DESKTOP-MACHINE
. Bir 'tam adı' üzerinden ulaşılabilir söyleyebiliriz sanırım echo %USERDOMAIN%\%USERNAME%
(bu sonucu, DESKTOP-MACHINE\bballdave025
bu maçları whoami
görmezden durumda,), hatta yoluyla echo %USERNAME%@%USERDOMAIN%
, sonuç bballdave025@DESKTOP-MACHINE
. Her şey kullanıcının (bizim için OP) neye ihtiyaç duyduğuna , yani etki alanı kısmının önemli olup olmadığına bağlıdır.
İçinde olmalı %USERNAME%
. Açıkçası bu kolayca taklit edilebilir, bu yüzden güvenlik için ona güvenmeyin.
Yararlı ipucu: set
bir komut istemi yazın tüm ortam değişkenlerini listeler.
Yanıt, hangi "komut satırı komut dosyası" dilinin bulunduğuna bağlıdır.
Eski cmd.exe
komut isteminde veya bir .bat
veya .cmd
komut dosyasında aşağıdakileri kullanabilirsiniz:
%USERNAME%
- Sadece kullanıcı adını alır.
%USERDOMAIN%
- Kullanıcının alan adını alır.
PowerShell komut isteminde veya bir .ps1
veya .psm1
komut dosyasında aşağıdakileri kullanabilirsiniz:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- Size tam nitelikli kullanıcı adı verir (ör. EtkiAlanı \ Kullanıcı Adı). Bu aynı zamanda en güvenli yöntemdir, çünkü $Env
aşağıdaki diğer değişkenler gibi kullanıcı tarafından geçersiz kılınamaz .
$Env:Username
- Sadece kullanıcı adını alır.
$Env:UserDomain
- Kullanıcının alan adını alır.
$Env:ComputerName
- Bilgisayarın adını alır.
% USERNAME% şu anda çalışan işlemin kullanıcı adını alacak. Toplu iş dosyanızı nasıl çalıştırdığınıza bağlı olarak, bu geçerli kullanıcının adıyla aynı olmayabilir. Örneğin, toplu iş dosyanızı zamanlanmış bir görevden, bir hizmetten vb. Çalıştırıyor olabilirsiniz.
İşte explorer.exe görevini başlatan kullanıcının adını kazıyarak, şu anda oturum açmış olan kullanıcının kullanıcı adını almanın daha kesin bir yolu:
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
Bu yöntemi test için toplu iş dosyaları yazarken kullanıyorum.
echo %userdomain%\%username%
Kimlik doğrulaması gerekiyorsa, parolayı düz metin olarak eklemeniz gerektiğinden, yalnızca diğer kullanıcıların görüntüleyemediği veya parolayı gören bir kullanıcının sonuç vermeyeceği tamamen özel bir ortamda kullanacağım.
Umarım bu birisine yardım eder.
Windows'un kim / whoami , sed ve AWK gibi Unix'in daha kullanışlı küçük komut dosyası yardımcı programlarına sahip olmadığı her zaman beni rahatsız ediyor . Her neyse, kusursuz bir şey istiyorsanız, Visual Studio Express'i alın ve aşağıdakileri derleyin:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
Ve bunu toplu iş dosyanızda kullanın.
net config Workstation | find "User name"
whoami
Windows Vista'dan başlayarak kullanılabilir.
Çoğu durumda,% USERNAME% değişkeni istediğiniz gibi olacaktır.
echo %USERNAME%
Ancak, yükseltilmiş bir cmd kabuğu çalıştırıyorsanız,% USERNAME% kendi kullanıcı adınız yerine yönetici adını bildirir. İkincisini bilmek istiyorsanız, çalıştırın:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
Bu kullanıcı adı değişkeni ve whoami komutu arasındaki temel farktır:
C:\Users\user.name>echo %username%
user.name
C:\Users\user.name>whoami
domain\user.name
DOMAIN = bios name of the domain (not fqdn)
Standart bir bağlamda, bağlı her kullanıcı bir explorer.exe işlemi tutar: [tasklist / V | find "explorer"] komutu, explorer.exe işlem sahibini içeren bir satır döndürür, uyarlanmış bir regex ile gerekli olanı elde etmek mümkündür değer. Bu, Windows 7 altında da mükemmel çalışır.
Nadir durumlarda explorer.exe başka bir programla değiştirilir, bulma filtresi bu duruma uyacak şekilde uyarlanabilir. Komut boş bir satır döndürürse, hiçbir kullanıcının oturum açmamış olması muhtemeldir. Windows 7 ile [query session | find ">"] çalıştırmak da mümkündür.
Bildiğim kadarıyla BlueBearr yanıtı bulmak en iyi (m, örneğin toplu komut dosyası örneğin SYSTEM hakları ile çalışan) ben buna bir şey eklemek zorunda. "%% a %% b" == "Kullanıcı Adı:" tarafından yakalanacak olan Windows dil sürümü (Lehçe) satırımda GERÇEKTEN TAMAMLANDI (benim dilimde bazı aksan karakterleri içeriyor) İlk 7 satırı atladım ve 8 üzerinde çalışır.
@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