0

我的程序是从在Local System Account(真实用户登录)下运行的服务启动的。该程序的任务之一是将文件存储在网络路径上,该路径应包含当前用户名 eg \\server\\storage\\%username%,但问题是当我读取环境变量时,我得到的是系统帐户的名称而不是用户帐户:

Environment.GetEnvironmentVariable("username");

在这种情况下,有没有办法获得正确的用户名?

4

2 回答 2

1

我的解决方案是找出哪个用户启动了资源管理器进程:

仅当您引用 .NETSystem.Management时才有效:

private static string GetExplorerUser()
{
    var process = Process.GetProcessesByName("explorer");
    return process.Length > 0
        ? GetUsernameByPid(process[0].Id)
        : "Unknown-User";
}

private static string GetUsernameByPid(int pid)
{
    var query = new ObjectQuery("SELECT * from Win32_Process "
        + " WHERE ProcessID = '" + pid + "'");

    var searcher = new ManagementObjectSearcher(query);
    if (searcher.Get().Count == 0)
        return "Unknown-User";

    foreach (ManagementObject obj in searcher.Get())
    {
        var owner = new String[2];
        obj.InvokeMethod("GetOwner", owner);
        return owner[0] ?? "Unknown-User";
    }

    return "Unknown-User";
}

另一种可能性是解析qwinsta命令的输出。

于 2011-04-05T14:23:34.223 回答
0

如果您没有采取任何措施以其他用户身份启动程序(CreateProcessAsUser 等人),那么它将以与调用程序相同的用户身份运行。

于 2011-04-05T11:56:31.340 回答