Во всех найденных примерах, начиная с родного от MS, предлагается применять GetTokenInformation к маркеру, полученному от OpenProcessToken. Таким образом можно получить пользователя, от имени которого создан процесс, но не пользователя, которому принадлежит текущий сеанс. То есть, в простейшем случае, для процессов, созданных "as administrator", это не работает.
Попробовал применить GetUserObjectInformation к результатам GetProcessWindowStation и OpenInputDesktop — в обоих случаях возвращается какой-то бред, отдаленно похожий на well-known SID:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Во всех найденных примерах, начиная с родного от MS, предлагается применять GetTokenInformation к маркеру, полученному от OpenProcessToken. Таким образом можно получить пользователя, от имени которого создан процесс, но не пользователя, которому принадлежит текущий сеанс. То есть, в простейшем случае, для процессов, созданных "as administrator", это не работает.
ЕМ>Попробовал применить GetUserObjectInformation к результатам GetProcessWindowStation и OpenInputDesktop — в обоих случаях возвращается какой-то бред, отдаленно похожий на well-known SID:
ЕМ>S-1-5-5-0-607555
ЕМ>Какие еще есть способы? Желательно, чтоб работало под XP, но можно и начиная с Win7.
А если так попробовать?
using System;
using System.Security.Principal;
using System.Management;
class App {
static string GetSID() {
var mos = new ManagementObjectSearcher(
new ManagementScope("\\\\localhost\\root\\cimv2"),
new ObjectQuery("SELECT username FROM Win32_ComputerSystem")
);
foreach (var mo in mos.Get()) {
var username = mo["username"].ToString();
var nta = new NTAccount(username);
var sid = (SecurityIdentifier)nta.Translate(typeof(SecurityIdentifier));
return sid.ToString();
}
throw new Exception("panic");
}
[STAThread]
static void Main(string[] args) {
Console.WriteLine(GetSID());
}
}
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Во всех найденных примерах, начиная с родного от MS, предлагается применять GetTokenInformation к маркеру, полученному от OpenProcessToken. Таким образом можно получить пользователя, от имени которого создан процесс, но не пользователя, которому принадлежит текущий сеанс. То есть, в простейшем случае, для процессов, созданных "as administrator", это не работает.
ЕМ>Попробовал применить GetUserObjectInformation к результатам GetProcessWindowStation и OpenInputDesktop — в обоих случаях возвращается какой-то бред, отдаленно похожий на well-known SID:
ЕМ>S-1-5-5-0-607555
ЕМ>Какие еще есть способы? Желательно, чтоб работало под XP, но можно и начиная с Win7.
На коленке, без обработки ошибок:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, kov_serg, Вы писали:
_>>А если так попробовать?
ЕМ>На "чистом" WinAPI, без залезания в классы WMI — никак?
Не ну можно конечно и грязно сделать:
Здравствуйте, Conr, Вы писали:
C>На коленке, без обработки ошибок:
Спасибо, работает. Хотя я уже сообразил сделать через GetShellWindow/GetWindowThreadProcessId. Насколько вероятна ситуация, в которой работают оконные приложения, но GetShellWindow возвращает нуль?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Спасибо, работает. Хотя я уже сообразил сделать через GetShellWindow/GetWindowThreadProcessId. Насколько вероятна ситуация, в которой работают оконные приложения, но GetShellWindow возвращает нуль?
Достаточно "уронить" explorer.exe. Или если установлен нестандартный shell, который не полностью реализует DDE запросы.
ЕМ>>Спасибо, работает. Хотя я уже сообразил сделать через GetShellWindow/GetWindowThreadProcessId. Насколько вероятна ситуация, в которой работают оконные приложения, но GetShellWindow возвращает нуль? C>Достаточно "уронить" explorer.exe. Или если установлен нестандартный shell, который не полностью реализует DDE запросы.
Windows terminal services тоже можно отключить.
Как много веселых ребят, и все делают велосипед...
C>>Или если установлен нестандартный shell, который не полностью реализует DDE запросы. ЕМ>Это уже маловероятно. Да и у меня на это ничего важного не завязано, для 99% сгодится, а в остальных никто и не заметит.
OpenDesktop("default",...) / GetUserObjectSecurity (owner)
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
ЕМ>>>Спасибо, работает. Хотя я уже сообразил сделать через GetShellWindow/GetWindowThreadProcessId. Насколько вероятна ситуация, в которой работают оконные приложения, но GetShellWindow возвращает нуль? C>>Достаточно "уронить" explorer.exe. Или если установлен нестандартный shell, который не полностью реализует DDE запросы. O>Windows terminal services тоже можно отключить.
Можно, но АПИ останется рабочим. Ведь начиная с висты сервисы работают в отдельной терм. сессии.
Здравствуйте, ononim, Вы писали:
O>>>Windows terminal services тоже можно отключить. LD>>Можно, но АПИ останется рабочим. O>Но не на ХР
Разве? Мне казалось, там это всегда работает в отличии от windows 2000.
O>>>>Windows terminal services тоже можно отключить. LD>>>Можно, но АПИ останется рабочим. O>>Но не на ХР LD>Разве? Мне казалось, там это всегда работает в отличии от windows 2000.
Не уверен, но вроде именно на ХР оно не работало, в те времена когда я ето апи щупал впервые 2000я уже была не актуальна (для меня). И у меня оно не работало, так как я отрубал терминал сервисы нафиг
Как много веселых ребят, и все делают велосипед...
O>>OpenDesktop("default",...) / GetUserObjectSecurity (owner) ЕМ>Там еще не лучше. И для OpenDesktop("default",...), и для OpenInputDesktop, и для GetProcessWindowStation выдаются одинаковые "SID": ЕМ>GetUserObjectInformation: S-1-5-5-0-599500 ЕМ>GetUserObjectSecurity: S-1-0x8014000000
А ну сори, написал, не проверив на винде.
ЕМ>Это что вообще за идентификаторы такие?
SID: S-1-5-5-X-Y
Название: Сеанс входа в систему
Описание: Сеанс входа в систему. Значения X и Y для этих идентификаторов SID меняются в каждом сеансе.
Здравствуйте, ononim, Вы писали:
O>SID: S-1-5-5-X-Y O>Название: Сеанс входа в систему
Блин, а я искал по S-1-5-5-0 (у мены там везде нуль). Спасибо!
O>Получается что это и есть, самый что ни на есть "SID текущего сеанса", как тебе хотелось. Бойся своих желаний