如何在Windows环境中找到当前用户?

时间:2009-10-22 13:38:16

标签: windows batch-file

运行命令行脚本时,是否可以获取当前用户的名称?操作系统是Windows XP。

15 个答案:

答案 0 :(得分:182)

您可以使用用户名变量:%USERNAME%

答案 1 :(得分:77)

<强>用户名:

echo %USERNAME%

<强>域名:

echo %USERDOMAIN%

您可以通过从命令提示符运行命令set来获取环境变量的完整列表。

答案 2 :(得分:55)

只需在命令提示符中使用此命令

C:\> whoami

答案 3 :(得分:44)

应该在%USERNAME%。显然这很容易被欺骗,所以不要依赖它来保证安全。

有用的提示:在命令提示符中键入set将列出所有环境变量。

答案 4 :(得分:14)

%USERNAME% 是批处理和Windows环境中其他正确答案。

另一种选择是使用 %USERPROFILE% 来获取用户的路径,例如C:\Users\username

答案 5 :(得分:4)

总是让我感到烦恼的是Windows没有一些更有用的Unix脚本实用程序,例如who / whoamisedAWK。无论如何,如果你想要一些万无一失的东西,请获取Visual Studio Express并编译以下内容:

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

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

只需在批处理文件中使用它。

答案 6 :(得分:4)

%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

答案 7 :(得分:3)

我在编写批处理文件时使用此方法进行测试。

echo %userdomain%\%username%

由于如果需要身份验证,您必须以纯文本格式包含密码,因此我只会在完全私密的环境中使用密码,而其他用户无法查看密码或者看到密码的用户不会产生任何后果。

希望这可以帮助别人。

答案 8 :(得分:3)

在大多数情况下,%USERNAME%变量将是您想要的。

echo %USERNAME%

但是,如果您正在运行提升的cmd shell,则%USERNAME%将报告管理员名称而不是您自己的用户名。如果你想知道后者,请运行:

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u

答案 9 :(得分:1)

答案取决于您使用的是哪种“命令行脚本”语言。

Cmd

在旧的cmd.exe命令提示符下或.bat.cmd脚本中,您可以使用以下命令:

%USERNAME%-仅获取用户名。

%USERDOMAIN%-获取用户的域。

PowerShell

在PowerShell命令提示符或.ps1.psm1脚本中,可以使用以下命令:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name-为您提供标准的用户名(例如Domain \ Username)。这也是最安全的方法,因为用户无法像下面的其他$Env变量一样覆盖它。

$Env:Username-仅获取用户名。

$Env:UserDomain-获取用户的域。

$Env:ComputerName-获取计算机的名称。

答案 10 :(得分:0)

在标准上下文中,每个连接的用户都拥有一个explorer.exe进程:命令[tasklist / V | find“explorer”]返回一行,其中包含explorer.exe进程所有者,并且可以使用改编的正则表达式获得所需的价值。这也可以在Windows 7下完美运行。

在极少数情况下,explorer.exe被另一个程序替换,可以调整查找过滤器以匹配此情况。如果命令返回空行,则很可能没有用户登录。使用Windows 7,还可以运行[query session | find“&gt;”]。

答案 11 :(得分: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

答案 12 :(得分:0)

这是用户名变量和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)

答案 13 :(得分:0)

通过powershell(file.ps1) 我使用以下

@page "/cosmos"
@inject TestWebsite.Services.CosmosDbProvider cosmosProvider;

<h3>Cosmos</h3>

@if(_db !=null)
{
    <p>Your database is called @_db.DatabaseName</p>
}

@code {

    TestWebsite.Services.ICosmosDbService _db;

    protected override async Task OnInitializedAsync()
    {
        // create/get CosmosDbService
        _db = await cosmosProvider.CreateAsync();
    }
}

它以“域\用户名”格式返回用户名。 如果您只想输入用户名

$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

优点是它可与Windows 10 Windows 8 Server 2016一起使用。据我所记得,还与其他操作系统(例如Win7等)(不旧)一起使用。 。是的,您可以简单地使用批处理

$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.Split("\")[1]

答案 14 :(得分:0)

只需在命令提示符下键入whoami,您将获得当前的用户名。