Главная страница
    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
2-1149060826
Григорий
2006-05-31 11:33
2006.06.18
taskbar


1-1147260207
Dr. Andrew
2006-05-10 15:23
2006.06.18
Как создать алгоритм возвращения поряд. номера слова в строке.


5-1133720702
775
2005-12-04 21:25
2006.06.18
отображать занятость номеров в гостиннице.


15-1148261306
GoreStudent
2006-05-22 05:28
2006.06.18
access


1-1146814280
pargo
2006-05-05 11:31
2006.06.18
Корректная работа с памятью.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский