2010-12-20 25 views
1

我有一个问题,这是...我用右键单击启动程序 - >以管理员身份运行。 这意味着程序正在管理环境中运行。获取当前登录用户(FullToken上下文)

WindowsIdentity.GetCurrent().Name; 

,如果我尝试获取用户名方式,我会得到启动PROGRAMM作为管理员用户。例如“管理员”,但我需要的是当前的登录用户名,其例如:鲍勃

任何人都可以帮我吗? :)

回答

0

也许你可以开始作为普通用户,保存用户名,然后以编程方式请求海拔:

Windows 7 and Vista UAC - Programmatically requesting elevation in C#

+0

我知道这将有可能通过模仿。那么没有其他办法了? – Lars 2010-12-20 16:17:05

+0

我不知道任何其他方法..这在安装过程中也是一个常见问题,因为您需要Admin访问来编写文件,但您需要用户访问才能获取正确的用户路径(/ docs和settings/Username/etc) ...?!? ..它不是一个错误,这是一个功能... – 2010-12-20 16:33:02

+0

:)不,我想卸载我加载的所有注册表,但不是我用作一种参考的本地用户的注册表。所以我需要找出这是哪一个。 – Lars 2010-12-20 16:38:48

0

所有.NET库都会从当前上下文中为您提供用户(在您的案例中为'Administrator')。

如果你想确保你的代码,你可以考虑念叨:Security in the .NET framework

4

你可以尝试使用WMI(System.Management.dll),以获得explorer.exe进程的所有者。

string GetExplorerUser() 
{ 
    var query = new ObjectQuery(
     "SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'"); 

    var explorerProcesses = new ManagementObjectSearcher(query).Get(); 

    foreach (ManagementObject mo in explorerProcesses) 
    { 
     string[] ownerInfo = new string[2]; 
     mo.InvokeMethod("GetOwner", (object[])ownerInfo); 

     return String.Concat(ownerInfo[1], @"\", ownerInfo[0]); 
    } 

    return string.Empty; 
} 

这依赖于一个事实,即explorer进程是单实例的,所以你不具有不同的用户凭据运行多个Explorer进程的可能结束。

+0

什么是终端服务,每个会话可以有它自己的explorer.exe进程? – 2012-03-26 13:56:47

+0

恐怕在这方面我无法帮到你。 – 2012-03-26 14:29:36

+0

正是我在找的! – 2013-02-14 07:38:28

0

1)Cassia应该能够给你一个当前登录的用户列表,包括RDC。

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions()) 
{ 
    // sess.SessionId 
    // sess.UserName 
} 

2)WMI(SO answer

Select * from Win32_LogonSession 

3)的PInvoke到WTSEnumerateSessions

4)枚举 “的explorer.exe” 的所有实例和使用的PInvoke获得所有者(OpenProcessHandle) 。

Process[] processes = Process.GetProcessesByName("explorer"); 

这有点哈克。 WMI也可以用于此。

如果您决定使用WMI的解决方案,那么将winmgmt设置为您的服务的依赖关系可能是个好主意。

相关问题