Из службы, запускаемой под LocalSystem делаю:
1. OpenInputDesktop(0, FALSE, DESKTOP_READOBJECTS);
2. GetUserObjectInformation(..., UOI_USER_SID, ...)
Служба определена как интерактивная, только вот OpenInputDesctop(...) возвращает NULL, описание ошибки "Incorrect function".
В чем может быть проблема?
Может есть другой способ получить SID текущего пользователя (обязательно залогиненого)?
Re: Как получить SID текущего пользователя (Win 2000 и выше)
A>Из службы, запускаемой под LocalSystem делаю: A>1. OpenInputDesktop(0, FALSE, DESKTOP_READOBJECTS); A>2. GetUserObjectInformation(..., UOI_USER_SID, ...) A>Служба определена как интерактивная, только вот OpenInputDesctop(...) возвращает NULL, описание ошибки "Incorrect function".
A>В чем может быть проблема? A>Может есть другой способ получить SID текущего пользователя (обязательно залогиненого)?
Непосредственно с OpenInputDesktop не выйдет. Используйте поиск — вопрос поднимался и были приведены решения. Вкратце — находим в текущей интерактивной оконной станции\десктопе процесс с характерным названием (например, explorer.exe) и пользуем его SID. Кстати, только что подумал, что можно GetDesktopWindow, GetWindowThreadProcessId, OpenProcess — а дальше сами знаете. Естественно, для этого сервис должен либо быть интерактивным, либо его надо интерактивизировать на время Как — тоже в поиске.
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Решилось довольно просто:
1. Нахожу PID характерного процесса (explorer.exe)
2. OpenProcess(...) -> OpenProcessToken(...) ->GetProcessToken(...) ->GetTokenInformation(..., TokenUser, ...)
3. Получил строку SID с помощью ConvertSidToStringSidA(...)
Когда вход в систему не выполнен, приложение explorer.exe не запущено со всеми вытекающими последствиями
Спасибо всем за ответы
Re[3]: Как получить SID текущего пользователя (Win 2000 и вы
Здравствуйте, aceproof, Вы писали:
A>Решилось довольно просто: A>1. Нахожу PID характерного процесса (explorer.exe) A>2. OpenProcess(...) -> OpenProcessToken(...) ->GetProcessToken(...) ->GetTokenInformation(..., TokenUser, ...) A>3. Получил строку SID с помощью ConvertSidToStringSidA(...)
A>Когда вход в систему не выполнен, приложение explorer.exe не запущено со всеми вытекающими последствиями
А если используется не эксплорер в качестве оболочки.
тогда Ваша проверка не годиться...
сначала необхлдимо узнать какая программа используеться в качестве оболочки
а потом искать именно это имя..
AMDG
Re: Как получить SID текущего пользователя (Win 2000 и выше)
Здравствуйте, aceproof, Вы писали:
A>Из службы, запускаемой под LocalSystem делаю: A>1. OpenInputDesktop(0, FALSE, DESKTOP_READOBJECTS); A>2. GetUserObjectInformation(..., UOI_USER_SID, ...) A>Служба определена как интерактивная, только вот OpenInputDesctop(...) возвращает NULL, описание ошибки "Incorrect function".
A>В чем может быть проблема? A>Может есть другой способ получить SID текущего пользователя (обязательно залогиненого)?
Мне видится проблема в двух аспектах:
1) Пользователей одновременно на терминальный сервер может залогиниться 200 штук. То есть можно получить не пользователя, а список пользователей.
2) Процесс может порождать потоки с правами иных пользователей.
В моём понимании текущий пользователь — пользователь, с правами которого выполняется текущий поток.
Григорий Цуканов
Re: Как получить SID текущего пользователя (Win 2000 и выше)
Здравствуйте, aceproof, Вы писали:
A>Решилось довольно просто: A>1. Нахожу PID характерного процесса (explorer.exe) A>2. OpenProcess(...) -> OpenProcessToken(...) ->GetProcessToken(...) ->GetTokenInformation(..., TokenUser, ...) A>3. Получил строку SID с помощью ConvertSidToStringSidA(...)
A>Когда вход в систему не выполнен, приложение explorer.exe не запущено со всеми вытекающими последствиями
A>Спасибо всем за ответы
В связи с этим у меня такой вопрос. Например в Windows XP одновременно может быть залогинено несколько пользователей, тогда что будет запущена только одна копия explorer.exe? И как определить пользователя, который в данный момент работает?
Re[4]: Как получить SID текущего пользователя (Win 2000 и вы
D>В связи с этим у меня такой вопрос. Например в Windows XP одновременно может быть залогинено несколько пользователей, тогда что будет запущена
только одна копия explorer.exe? И как определить пользователя, который в данный момент работает?
Будет запущено несколько оболочек explorer.exe — по одному на каждого. А также кое-какие другие процессы-сервисы.
Re[4]: Как получить SID текущего пользователя (Win 2000 и вы
A>>Решилось довольно просто: A>>1. Нахожу PID характерного процесса (explorer.exe) A>>2. OpenProcess(...) -> OpenProcessToken(...) ->GetProcessToken(...) ->GetTokenInformation(..., TokenUser, ...) A>>3. Получил строку SID с помощью ConvertSidToStringSidA(...)
A>>Когда вход в систему не выполнен, приложение explorer.exe не запущено со всеми вытекающими последствиями
A>>Спасибо всем за ответы
D>В связи с этим у меня такой вопрос. Например в Windows XP одновременно может быть залогинено несколько пользователей, тогда что будет запущена только одна копия explorer.exe? И как определить пользователя, который в данный момент работает?
Будет несколько копий эксплорера. Но, думаю, ничего страшного в принципе. Устанавливаем текущим десктопом для сервиса на время проверки текущий input десктоп и оконную станцию интерактивной сессии (вот только как определить оконную станцию, надо подумать. Для каждой сессии у нас будет своя WinSta0, причем префексированная именем сессии). Соотв., задача сводится к определению имени\номера интерактивной сессии (или таки по имени WinSta0 мы будем получать оконную станцию текущего интерактивного пользователя — может, тут Alex Fedotov что подскажет?), перебираем окна на активном десктопе в поисках класса explorer'а, ну а дальше вы уже знаете.