Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

Неработает завершение сеанса ExitWindowsEx(EWX_LOGOFF, 0)   Найти похожие ветки 

 
StudentVNN   (2006-03-21 12:27) [0]

Делаю завершение сеанса в сервисе

Даю привелегию "SeShutdownPrivilege" -  ОК! проверил вьювером процессов
(завершение сеанса для отладки,вобщето надо выключить)

main...

CreateThread(nil,0,@RR,nil,0,rl);

 FillStr("Service1", pServiceName);
 FillStr("Server11", pServiceDName);
...
StartServiceCtrlDispatcher(ste[0]);
...
сам сервис отлажен,кроме выключения

procedure RR;stdcall;
var
s:string;
begin
NTSetPrivilege("SeShutdownPrivilege" ,true);
MessageBoxEx(0,"шт","",MB_SERVICE_NOTIFICATION,0);
 sleep(10000);
if  ExitWindowsEx(EWX_LOGOFF, 0)=false then begin
                                           str(GetLastError,s);
MessageBoxEx(0,PCHAR(S),"",MB_SERVICE_NOTIFICATION,0);
                                               end;
end;

Входит в трейд ,но незавершает сеанс, ошибка =1 ,по
апи это Неверная функция

Если создать простую форму и бросить на CreateForm
ExitWindowsEx(EWX_LOGOFF, 0) код работает!!

Я плакатъ от привелегий и непойму где ошибка?


 
Сергей М. ©   (2006-03-21 12:31) [1]


> Я плакатъ от привелегий и непойму где ошибка?


Ты ее и не ищешь, ошибку ту ..

NTSetPrivilege() - это ж функция, наверно ... И где у тебя, спрашивается, анализ результатов ее выполнения ?


 
clickmaker ©   (2006-03-21 12:33) [2]

MSDN:
EWX_LOGOFF Shuts down all processes running in the logon session of the process that called the ExitWindowsEx function. Then it logs the user off.
This flag can be used only by processes running in an interactive user"s logon session.


 
Eraser ©   (2006-03-21 12:46) [3]


> StudentVNN   (21.03.06 12:27)


function SetPrivilege(aPrivilegeName : string;  
                     aEnabled : boolean ): boolean;  
var  
 TPPrev,  
 TP         : TTokenPrivileges;  
 Token      : THandle;  
 dwRetLen   : DWord;  
begin  
 Result := False;  
 OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES  
                  or TOKEN_QUERY, @Token );  

 TP.PrivilegeCount := 1;  
 if( LookupPrivilegeValue(nil, PChar( aPrivilegeName ),  
                          TP.Privileges[ 0 ].LUID ) ) then  
 begin  
   if( aEnabled )then  
     TP.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;  
   else  
     TP.Privileges[0].Attributes:= 0;  

   dwRetLen := 0;  
   Result := AdjustTokenPrivileges(Token,False,TP,  
                                   SizeOf( TPPrev ),  
                                   TPPrev,dwRetLen );  
 end;  

 CloseHandle( Token );  
end;  

function WinExit( iFlags : integer ) : boolean;  
//   возможные флаги:
//   EWX_LOGOFF  
//   EWX_REBOOT  
//   EWX_SHUTDOWN  
begin  
 Result := True;  
 if( SetPrivilege( "SeShutdownPrivilege", true ) ) then  
 begin  
   if( not ExitWindowsEx( iFlags, 0 ) )then  
   begin  
     Result := False;  
   end;  
   SetPrivilege( "SeShutdownPrivilege", False )  
 end  
 else  
 begin  
   Result := False;  
 end;  
end;


 
StudentVNN   (2006-03-21 14:27) [4]

>NTSetPrivilege() - это ж функция, наверно ... И где у тебя, спрашивается, анализ результатов ее выполнения

проверил - работает,
внешним просмотром привелегий у своего EXE

>This flag can be used only by processes running in an interactive user"s logon session.

спасибо,вот попал ,окно придется делать с инерактивностью


 
Eraser ©   (2006-03-21 14:59) [5]


> StudentVNN   (21.03.06 14:27) [4]


> окно придется делать с инерактивностью

окно вообще не при чём...
вот небольшой пример по теме (правда на c++ и из MSDN):

DWORD dwGuiThreadId = 0;

int
UserMessageBox(
   RPC_BINDING_HANDLE h,
   LPSTR lpszWindowStation,
   LPSTR lpszDesktop,
   LPSTR lpszText,
   LPSTR lpszTitle,
   UINT fuStyle)
{
   DWORD dwThreadId;
   HWINSTA hwinstaSave;
   HDESK hdeskSave;
   HWINSTA hwinstaUser;
   HDESK hdeskUser;
   int result;

   // Ensure connection to service window station and desktop, and
   // save their handles.

   hwinstaSave = GetProcessWindowStation();
   dwThreadId = GetCurrentThreadId();
   hdeskSave = GetThreadDesktop(dwThreadId);

   // Impersonate the client and connect to the User"s
   // window station and desktop.

   RpcImpersonateClient(h);
   hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED);
   if (hwinstaUser == NULL)
   {
       RpcRevertToSelf();
       return 0;
   }
   SetProcessWindowStation(hwinstaUser);
   hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED);
   RpcRevertToSelf();
   if (hdeskUser == NULL)
   {
       SetProcessWindowStation(hwinstaSave);
       CloseWindowStation(hwinstaUser);
       return 0;
   }
   SetThreadDesktop(hdeskUser);

   // Display message box.

   dwGuiThreadId = dwThreadId;
   result = MessageBox(NULL, lpszText, lpszTitle, fuStyle);
   dwGuiThreadId = 0;

   // Restore window station and desktop.

   SetThreadDesktop(hdeskSave);
   SetProcessWindowStation(hwinstaSave);
   CloseDesktop(hdeskUser);
   CloseWindowStation(hwinstaUser);

   return result;
}

вместо RpcImpersonateClient(h); можно применять любую другую аналогичную ф-ю олицетвореня.
Так же может помочь нотификатор SERVICE_CONTROL_SESSIONCHANGE, который надо зарегистрировать ф-ей RegisterServiceCtrlHandlerEx.
Или же пригодится Winlogon Notification Package.
Подробнее см. MSND.


 
StudentVNN   (2006-03-21 18:30) [6]

спасибо!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
15-1148137010
YurikGL
2006-05-20 18:56
2006.06.18
Remote desktop в win200 Server потеря сеанса...


2-1149143758
RameS
2006-06-01 10:35
2006.06.18
вопрос по MDI


15-1148448464
DillerXX
2006-05-24 09:27
2006.06.18
Товарищи, ну помогите же с COM иначе мне конец :(


1-1147283808
Андрей2500
2006-05-10 21:56
2006.06.18
сортировка Stringgrid по алфавиту


15-1148044646
dimodim-furyz
2006-05-19 17:17
2006.06.18
Java 2 J2me у кого есть есть инфа?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский