Как получить SID текущего пользователя (Win 2000 и выше)
От: aceproof  
Дата: 18.11.04 08:50
Оценка:
Из службы, запускаемой под LocalSystem делаю:
1. OpenInputDesktop(0, FALSE, DESKTOP_READOBJECTS);
2. GetUserObjectInformation(..., UOI_USER_SID, ...)
Служба определена как интерактивная, только вот OpenInputDesctop(...) возвращает NULL, описание ошибки "Incorrect function".

В чем может быть проблема?
Может есть другой способ получить SID текущего пользователя (обязательно залогиненого)?
Re: Как получить SID текущего пользователя (Win 2000 и выше)
От: Andrew S Россия http://alchemy-lab.com
Дата: 18.11.04 09:42
Оценка:
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 — а дальше сами знаете. Естественно, для этого сервис должен либо быть интерактивным, либо его надо интерактивизировать на время Как — тоже в поиске.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Как получить SID текущего пользователя (Win 2000 и выше)
От: Serjio Россия  
Дата: 18.11.04 11:22
Оценка:
>Может есть другой способ получить SID текущего пользователя (обязательно залогиненого)?

getsid ?
Только на РСДН помимо ответа на вопрос, можно получить еще список орфографических ошибок и узнать что-то новое из грамматики английского языка (c) http://www.rsdn.ru/forum/cpp/4720035.1.aspx
Автор: ZOI4
Дата: 28.04.12
Re[2]: Как получить SID текущего пользователя (Win 2000 и вы
От: aceproof  
Дата: 18.11.04 15:19
Оценка:
Решилось довольно просто:
1. Нахожу PID характерного процесса (explorer.exe)
2. OpenProcess(...) -> OpenProcessToken(...) ->GetProcessToken(...) ->GetTokenInformation(..., TokenUser, ...)
3. Получил строку SID с помощью ConvertSidToStringSidA(...)

Когда вход в систему не выполнен, приложение explorer.exe не запущено со всеми вытекающими последствиями

Спасибо всем за ответы
Re[3]: Как получить SID текущего пользователя (Win 2000 и вы
От: CybAng  
Дата: 22.11.04 08:36
Оценка:
Здравствуйте, 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 и выше)
От: siberia Россия http://siberiaway.com
Дата: 17.01.05 05:49
Оценка:
Здравствуйте, 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 и выше)
От: Alex Fedotov США  
Дата: 17.01.05 09:22
Оценка:
Здравствуйте, aceproof, Вы писали:

A>Может есть другой способ получить SID текущего пользователя (обязательно залогиненого)?


Eсли Windows 2000 и выше, то можно не извращаться, а воспользоваться WTS API (см. WTSEnumerateSessions).
-- Alex Fedotov
Re[3]: Как получить SID текущего пользователя (Win 2000 и вы
От: Davidian Россия  
Дата: 26.01.05 09:21
Оценка:
Здравствуйте, 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 и вы
От: Кодёнок  
Дата: 26.01.05 10:30
Оценка:
D>В связи с этим у меня такой вопрос. Например в Windows XP одновременно может быть залогинено несколько пользователей, тогда что будет запущена
только одна копия explorer.exe? И как определить пользователя, который в данный момент работает?

Будет запущено несколько оболочек explorer.exe — по одному на каждого. А также кое-какие другие процессы-сервисы.
Re[4]: Как получить SID текущего пользователя (Win 2000 и вы
От: Andrew S Россия http://alchemy-lab.com
Дата: 26.01.05 10:42
Оценка:
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'а, ну а дальше вы уже знаете.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.