Interactive Сервис, с Log on : [сетевой юзер]
От: -lexa- Россия  
Дата: 06.03.02 12:00
Оценка:
Проблема в следующем :

Win2k, есть сервис , содержащий DCom объекты , соответственно чтоб их использовать по сети в Log on стоит не LocalSystem и данный сервис запускается в неинтерактивной сессии(window station). В то же время один из методов объекта должен выдавать юзеру диалог.
Соответственно необходимо обеспечить возможность взаимодействия сервиса с активным(видимым) десктопом из неинтерактивной сессии. В MSDN написано что для этого необходимо инперсонализоваться открыть интерактивную сессию, в ней выдать диалог , вернуться в исхлдную сессию... Там приведен код с инперсонализацией через RpcImpersonateClient(h) , где необходимый handle h передается в метод. У меня этого хендела на клиенте нет тк я в явном виде rpc не использую. Как выйти из ситуации — может кто сталкивался с проблеммой — киньте example

ps
пробовал инперсонализовываться через CoImpersonateClient в коде соответствующего метода Com объекта — не отрабатывает

вот код с использованием CoImpersonateClient

STDMETHODIMP CServiceComObj::ShowMyDlg2()
{

DWORD dwThreadId;
HWINSTA hwinstaSave;
HDESK hdeskSave;
HWINSTA hwinstaUser;
HDESK hdeskUser;
int result;

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

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

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

// RpcImpersonateClient(h);
LPSTR lpszWindowStation="WinSta0";
LPSTR lpszDesktop="WinSta0\\Default";
LPSTR lpszText="Данный MessageBox вызывается из сервиса \n со сменой Window Station на интерактивную \n и инперсонализацией процесса сервиса7";
LPSTR lpszTitle="Сообщение о кошках";
UINT fuStyle=MB_OK;

HRESULT hrInpersonate;

hrInpersonate=CoImpersonateClient( );

hwinstaUser = OpenWindowStation(lpszWindowStation, FALSE, MAXIMUM_ALLOWED);
if (hwinstaUser == NULL)
{
CoRevertToSelf();
return S_OK;
}

SetProcessWindowStation(hwinstaUser);
hdeskUser = OpenDesktop(lpszDesktop, 0, FALSE, MAXIMUM_ALLOWED);
if (hdeskUser == NULL)
{
SetProcessWindowStation(hwinstaSave);
CloseWindowStation(hwinstaUser);
return S_OK;
}
SetThreadDesktop(hdeskUser);

dwGuiThreadId = dwThreadId;
result = MessageBox(NULL, lpszText, lpszTitle, fuStyle);
// MessageBox выдается для простоты в данном примере — на самом деле здесь свой диатог так что
//MB_DEFAULT_DESKTOP_ONLY не подходит...
dwGuiThreadId = 0;

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

return S_OK;
}
-А где же товарищи Кошки?
-Они не приехали....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.