Re: Много непоняток с WinAPI (было: Logoff current user in Windows NT)
- From
- Victor ()
- To
- All
- Date
- 2001-06-12T18:42:37Z
- Area
- SU.WINDOWS.NT.PROG
From: "Victor" <VictorK@mastereye.com>
Subject: Re: Много непоняток с WinAPI (было: Logoff current user in Windows NT)
"Demid" <demid@pstu.edu> wrote in message news:3b25dcda@news.donin.com...
>
> Странные проблемы обнаруживаю с некоторыми функциями 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К. Т.е если стоит EWX_FORCE,
то EWX_FORCEIFHUNG игнорируется.
> флаги игнорирует. Как победить? Идеальным поведением было бы
> следующее: приложения, которые закрываются без вопросов,
> закрываются; для приложений, которые спрашивают "сохранить..."
> или что-то в этом роде, дается тайм-аут, по истечении которого
> приложение принудительно закрывается, если к тому времени не завершило
> выполнение и независимо от того, что нажимал пользователь в этом
> приложении.
Вызвать сперва без флагов, подождать сигнала логофа, если
его нет повторить с EWX_FORCE, а потом может с EWX_FORCEIFHUNG - ну
добить-же надо ;-)) И запустить можно отдельным потоком из сервиса.
>
> 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.
>
Ну ты погляди на функцию WTSQuerySessionInformation с параметром
WTSInfoClass
установленным в WTSWinStationName - выгребешь имя станции по ID сессии.
> Пока все. В общем, ничего у меня не работает :( Уже не знаю, что делать
прямо.
Эт нормально, эт у всех бывает 8-))
Успехов!
--- ifmail v.2.15dev5
* Origin: EUnet AG, Switzerland. A KPNQwest Company. (2:5020/400)