Я использую следующий код, чтобы получить текущего пользователя и владельца процесса моего приложения.Записан пользователь для приложения
Текущий пользователь:
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
Ваш ответ занял у меня пару минут, чтобы найти, как вы его изменили. Спасибо за обновление. Да, у исходного сообщения не было объявления WtsInfoClass, которое я использовал pinvoke.net для получения. –