2011-04-05 37 views
0

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

Environment.GetEnvironmentVariable("username"); 

是否有一种方式来获得在这种情况下正确的用户名?

回答

1

我的解决办法是找出哪个用户启动Explorer进程:

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"; 
} 

另一种可能性是解析的输出:

如果引用的.NET System.Management

只会工作命令qwinsta

0

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

相关问题