Главная страница
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.03 c
2-1149249027
XTD
2006-06-02 15:50
2006.06.18
Unsatisfied forward or external declaration: ????


4-1142864380
dva20
2006-03-20 17:19
2006.06.18
Свое главное окно сделать дочерним чужого и наоборот


4-1142930728
Nike
2006-03-21 11:45
2006.06.18
использование ToolHelp на WinNT


15-1148562857
Вася Аникеев
2006-05-25 17:14
2006.06.18
Что делать, комп ругается?


4-1142762772
Volf_555
2006-03-19 13:06
2006.06.18
Как по хэндлу получить список файлов рабочего стола в TListBox?