Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Неработает завершение сеанса 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 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
2-1148835732
Fiallo4ka
2006-05-28 21:02
2006.06.18
Базы данных в Delphi


2-1148732237
VANAP
2006-05-27 16:17
2006.06.18
Сохранение в Paradox и фильтр


2-1149010954
Lexa11_2002
2006-05-30 21:42
2006.06.18
Вращение фигур


4-1142270326
dimak-2k
2006-03-13 20:18
2006.06.18
Работа с портом LPT


15-1148510953
Копир
2006-05-25 02:49
2006.06.18
Уважаемые господа, владельцы телефонов Siemens