Много непоняток с WinAPI (было: Logoff current user in Windows NT)

From
Demid ()
To
All
Date
2001-06-12T13:12:46Z
Area
SU.WINDOWS.NT.PROG
From: "Demid" <demid@pstu.edu>


Странные проблемы обнаруживаю с некоторыми функциями WinAPI.
Наверное, я чего-то недопонимаю, но по MSDN-у сложно судить, чего
именно.

        1. Функция ExitWindowsEx
Вызываю в следующем виде:

    ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, 0)

Согласно описанию, это должно принудительно закрыть все запущенные
процессы. И действительно, под Windows NT 4.0 это так и происходит - все
моментально закрывается и пользователь разлоговывается. Но под
Windows 2000 для зависших или ожидающих ввода пользователя
процессов появляется характерное окошко (End process), и, что
самое неприятное, пользователь может прервать logoff, нажав Cancel
либо в этом окошке, либо в приложении (если оно спрашивает, сохранить
ли файл, например). И еще - флаг EWX_FORCEIFHUNG, который
описан в этой функции как введенный именно с Windows 2000, точно так
же себя ведет, т.е. впечатление такое, что Windows 2000 вообще эти
флаги игнорирует. Как победить? Идеальным поведением было бы
следующее: приложения, которые закрываются без вопросов,
закрываются; для приложений, которые спрашивают "сохранить..."
или что-то в этом роде, дается тайм-аут, по истечении которого
приложение принудительно закрывается, если к тому времени не завершило
выполнение и независимо от того, что нажимал пользователь в этом
приложении.

          2. Функции GetUserObjectInformation и LookupAccountSid
Первая - из серии работы с Window Station. Не знаю, какая из них глючит, но
вываю последовательно

GetUserObjectInformation(hWinSta, UOI_USER_SID, pSID, dwSIDLength,
    &dwLengthNeeded);
LookupAccountSid(NULL, pSID, &UserName, &dwUserNameLength, &DomainName,
    &dwDomainNameLength, &SidUse);

Первая функция возвращает какую-то структуру длиной 20 байт. Проверить ее
правильность я не в состоянии, но вторая функция упорно генерирует ошибку
ERROR_NONE_MAPPED, что означает, что переданный ей SID неправильный или
не соответствует ни одной из учетных записей. Манипуляции с локальными/доменными
именами результата не дали. С именем станции (первый параметр ф-ии
LookupAccountSid)-
тоже (пробовал подставлять имя контроллера домена). hWinSta (хэндл Window
Station),
судя по всему - правильный. Куда копать дальше?

          3. Функция EnumWindowStations
Странно себя ведет под Windows Terminal Server. Если ее вызывать из терминальной
сессии, перечисляет ровно одну Window Station, причем всегда "WinSta0". И это в
тот
момент, когда я лично запустил две терминальные сессии к этому серверу. Это,
наверное, такая "фича", но странная она, мягко говоря. Вопрос: как получить
полный
список Window Stations в Windows 2000 с установленным terminal services? Я знаю,
что у terminal services есть свое API (функции, начинающиеся на WTS), но там
можно
получить только список сессий, а это не то же самое, что список Window Station.

Пока все. В общем, ничего у меня не работает :( Уже не знаю, что делать прямо.
Хеееееелп!!!
:)

--
с ув.  Демид Тузенко



--- ifmail v.2.15dev5
 * Origin: AIC Ltd. (2:5020/400)