我正在使用以下代码来获取当前用户和我的应用程序进程的所有者。
当前用户:
CurrentUser = WindowsIdentity.GetCurrent().Name;
流程所有者:
String strQuery = String.Format("Select * From Win32_Process where Name='{0}'", ProcessName);
ObjectQuery oQuery = new ObjectQuery(strQuery);
ManagementObjectSearcher oManSearcher = new ManagementObjectSearcher(oQuery);
foreach (ManagementObject oManItem in oManSearcher.Get())
{
String[] s = new String[2];
oManItem.InvokeMethod("GetOwner", (object[])s);
ProcessOwner = s[0];
break;
}
我需要从语法上确定我的应用程序实例在哪个用户帐户中运行。
基本上,我允许每个登录用户使用一个我的应用程序实例。
当用户正常启动应用程序时,上述代码有效。当用户右键单击快捷方式(或使用类似方法)并选择“以管理员身份运行”时,代码会发生故障。在这种情况下,进程所有者将不是登录用户,而是管理员。
这对确定多个实例造成了严重破坏,更不用说正确的数据库路径等了。
从我的角度来看,正常启动的实例和以管理员身份启动的实例都是同一登录用户下的实例,只是所有者不同。
如何确定进程属于哪个登录用户?如前所述,检查当前用户的进程所有者并不总是最好的检查。
回答:
这是从所选答案开发的完整方法。
public static String GetUsernameBySessionId(int sessionId, Boolean prependDomain)
{
IntPtr buffer;
int strLen;
String username = "SYSTEM";
if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1)
{
username = Marshal.PtrToStringAnsi(buffer);
WTSFreeMemory(buffer);
if (prependDomain)
{
if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSDomainName, out buffer, out strLen) && strLen > 1)
{
username = String.Format("{0}\\{1}", Marshal.PtrToStringAnsi(buffer), username);
WTSFreeMemory(buffer);
}
}
}
return username;
}
当前进程SessionId为:
Process.GetCurrentProcess().SessionId