Форум: "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.011 c