mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
401 lines
9.0 KiB
401 lines
9.0 KiB
/*++
|
|
|
|
Copyright (c) 1999-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
HelpMgr.h
|
|
|
|
Abstract:
|
|
|
|
Declaration of the CRemoteDesktopHelpSessionMgr
|
|
|
|
Author:
|
|
|
|
HueiWang 2/17/2000
|
|
|
|
--*/
|
|
#ifndef __REMOTEDESKTOPHELPSESSIONMGR_H_
|
|
#define __REMOTEDESKTOPHELPSESSIONMGR_H_
|
|
|
|
#include "resource.h" // main symbols
|
|
|
|
|
|
typedef struct __ExpertLogoffStruct {
|
|
HANDLE hWaitObject;
|
|
HANDLE hWaitProcess;
|
|
LONG ExpertSessionId;
|
|
CComBSTR bstrHelpedTicketId;
|
|
|
|
CComBSTR bstrWinStationName;
|
|
|
|
__ExpertLogoffStruct() {
|
|
hWaitObject = NULL;
|
|
hWaitProcess = NULL;
|
|
};
|
|
|
|
~__ExpertLogoffStruct() {
|
|
if( NULL != hWaitObject )
|
|
{
|
|
UnregisterWait( hWaitObject );
|
|
}
|
|
|
|
if( NULL != hWaitProcess )
|
|
{
|
|
CloseHandle( hWaitProcess );
|
|
}
|
|
}
|
|
} EXPERTLOGOFFSTRUCT, *PEXPERTLOGOFFSTRUCT;
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"{
|
|
#endif
|
|
|
|
HRESULT
|
|
ImpersonateClient();
|
|
|
|
void
|
|
EndImpersonateClient();
|
|
|
|
HRESULT
|
|
LoadLocalSystemSID();
|
|
|
|
HRESULT
|
|
RegisterResolverWithGIT(
|
|
ISAFRemoteDesktopCallback* pResolver
|
|
);
|
|
|
|
HRESULT
|
|
LoadResolverFromGIT(
|
|
ISAFRemoteDesktopCallback** ppResolver
|
|
);
|
|
|
|
HRESULT
|
|
UnInitializeGlobalInterfaceTable();
|
|
|
|
HRESULT
|
|
InitializeGlobalInterfaceTable();
|
|
|
|
DWORD
|
|
MonitorExpertLogoff(
|
|
IN LONG pidToWaitFor,
|
|
IN LONG expertSessionId,
|
|
IN BSTR bstrHelpedTicketId
|
|
);
|
|
|
|
VOID
|
|
CleanupMonitorExpertList();
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
typedef MAP<PVOID, PEXPERTLOGOFFSTRUCT> EXPERTLOGOFFMONITORLIST;
|
|
|
|
|
|
class CRemoteDesktopHelpSession;
|
|
|
|
|
|
//
|
|
// Help Session Manager service name, this must be consistent with
|
|
// with COM or COM won't find us.
|
|
//
|
|
#define HELPSESSIONMGR_SERVICE_NAME \
|
|
_TEXT("RemoteDesktopHelpSessionMgr")
|
|
|
|
//
|
|
// STL Help Session ID to actual help session object map.
|
|
//
|
|
typedef MAP< CComBSTR, CComObject<CRemoteDesktopHelpSession>* > IDToSessionMap;
|
|
typedef CComObject< CRemoteDesktopHelpSession > RemoteDesktopHelpSessionObj;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRemoteDesktopHelpSessionMgr
|
|
class ATL_NO_VTABLE CRemoteDesktopHelpSessionMgr :
|
|
public CComObjectRootEx<CComMultiThreadModel>,
|
|
public CComCoClass<CRemoteDesktopHelpSessionMgr, &CLSID_RemoteDesktopHelpSessionMgr>,
|
|
public IDispatchImpl<IRemoteDesktopHelpSessionMgr, &IID_IRemoteDesktopHelpSessionMgr, &LIBID_RDSESSMGRLib>
|
|
{
|
|
friend class CRemoteDesktopUserPolicy;
|
|
|
|
public:
|
|
CRemoteDesktopHelpSessionMgr();
|
|
~CRemoteDesktopHelpSessionMgr() {}
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_REMOTEDESKTOPHELPSESSIONMGR)
|
|
|
|
//DECLARE_CLASSFACTORY_SINGLETON(CRemoteDesktopHelpSessionMgr)
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(CRemoteDesktopHelpSessionMgr)
|
|
COM_INTERFACE_ENTRY(IRemoteDesktopHelpSessionMgr)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
END_COM_MAP()
|
|
|
|
//
|
|
// Can't impersonate so can't pre-load user SID at FinalConstruct()
|
|
//
|
|
|
|
HRESULT
|
|
FinalConstruct()
|
|
{
|
|
ULONG count = _Module.AddRef();
|
|
|
|
DebugPrintf(
|
|
_TEXT("Module AddRef by CRemoteDesktopHelpSessionMgr() %d...\n"),
|
|
count
|
|
);
|
|
|
|
BOOL bSuccess = _Module.InitializeSessmgr();
|
|
|
|
DebugPrintf(
|
|
_TEXT("_Module.InitializeSessmgr() return %d\n"),
|
|
bSuccess
|
|
);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
void
|
|
FinalRelease()
|
|
{
|
|
Cleanup();
|
|
|
|
ULONG count = _Module.Release();
|
|
|
|
DebugPrintf(
|
|
_TEXT("Module Release by CRemoteDesktopHelpSessionMgr() %d ...\n"),
|
|
count
|
|
);
|
|
}
|
|
|
|
|
|
// IRemoteDesktopHelpSessionMgr
|
|
public:
|
|
|
|
|
|
STDMETHOD(ResetHelpAssistantAccount)(
|
|
/*[in]*/ BOOL bForce
|
|
);
|
|
|
|
STDMETHOD(CreateHelpSession)(
|
|
/*[in]*/ BSTR bstrSessName,
|
|
/*[in]*/ BSTR bstrSessPwd,
|
|
/*[in]*/ BSTR bstrUserHelpBlob,
|
|
/*[in]*/ BSTR bstrUserHelpCreateBlob,
|
|
/*[out, retval]*/ IRemoteDesktopHelpSession** ppIRemoteDesktopHelpSession
|
|
);
|
|
|
|
STDMETHOD(DeleteHelpSession)(
|
|
/*[in]*/ BSTR HelpSessionID
|
|
);
|
|
|
|
STDMETHOD(RetrieveHelpSession)(
|
|
/*[in]*/ BSTR HelpSessionID,
|
|
/*[out, retval]*/ IRemoteDesktopHelpSession** ppIRemoteDesktopHelpSession
|
|
);
|
|
|
|
STDMETHOD(VerifyUserHelpSession)(
|
|
/*[in]*/ BSTR HelpSessionId,
|
|
/*[in]*/ BSTR bstrSessPwd,
|
|
/*[in]*/ BSTR bstrResolverConnectBlob,
|
|
/*[in]*/ BSTR bstrUserHelpCreateBlob,
|
|
/*[in]*/ LONG CallerProcessId,
|
|
/*[out]*/ ULONG_PTR* phHelpCtr,
|
|
/*[out]*/ LONG* pResolverRetCode,
|
|
/*[out, retval]*/ long* pdwUserLogonSession
|
|
);
|
|
|
|
STDMETHOD(GetUserSessionRdsSetting)(
|
|
/*[out, retval]*/ REMOTE_DESKTOP_SHARING_CLASS* sessionRdsLevel
|
|
);
|
|
|
|
STDMETHOD(RemoteCreateHelpSession)(
|
|
/*[in]*/ REMOTE_DESKTOP_SHARING_CLASS sharingClass,
|
|
/*[in]*/ LONG timeOut,
|
|
/*[in]*/ LONG userSessionId,
|
|
/*[in]*/ BSTR userSid,
|
|
/*[in]*/ BSTR bstrUserHelpCreateBlob,
|
|
/*[out, retval]*/ BSTR* parms
|
|
);
|
|
|
|
STDMETHOD(CreateHelpSessionEx)(
|
|
/*[in]*/ REMOTE_DESKTOP_SHARING_CLASS sharingClass,
|
|
/*[in]*/ BOOL fEnableCallback,
|
|
/*[in]*/ LONG timeOut,
|
|
/*[in]*/ LONG userSessionId,
|
|
/*[in]*/ BSTR userSid,
|
|
/*[in]*/ BSTR bstrUserHelpCreateBlob,
|
|
/*[out, retval]*/ IRemoteDesktopHelpSession** ppIRemoteDesktopHelpSession
|
|
);
|
|
|
|
HRESULT RemoteCreateHelpSessionEx(
|
|
/*[in]*/ BOOL bCacheEntry,
|
|
/*[in]*/ BOOL bEnableResolver,
|
|
/*[in]*/ REMOTE_DESKTOP_SHARING_CLASS sharingClass,
|
|
/*[in]*/ LONG timeOut,
|
|
/*[in]*/ LONG userSessionId,
|
|
/*[in]*/ BSTR userSid,
|
|
/*[in]*/ BSTR bstrUserHelpCreateBlob,
|
|
/*[out, retval]*/ RemoteDesktopHelpSessionObj** ppIRemoteDesktopHelpSession
|
|
);
|
|
|
|
STDMETHOD(IsValidHelpSession)(
|
|
/*[in]*/ BSTR HelpSessionId,
|
|
/*[in]*/ BSTR HelpSessionPwd
|
|
);
|
|
|
|
STDMETHOD(LogSalemEvent)(
|
|
/*[in]*/ long ulEventType,
|
|
/*[in]*/ long ulEventCode,
|
|
/*[in]*/ VARIANT* pEventStrings
|
|
);
|
|
|
|
static HRESULT
|
|
AddHelpSessionToCache(
|
|
IN BSTR bstrHelpId,
|
|
IN CComObject<CRemoteDesktopHelpSession>* pIHelpSession
|
|
);
|
|
|
|
static HRESULT
|
|
DeleteHelpSessionFromCache(
|
|
IN BSTR bstrHelpId
|
|
);
|
|
|
|
static void
|
|
TimeoutHelpSesion();
|
|
|
|
static void
|
|
LockIDToSessionMapCache()
|
|
{
|
|
gm_HelpIdToHelpSession.Lock();
|
|
}
|
|
|
|
static void
|
|
UnlockIDToSessionMapCache()
|
|
{
|
|
gm_HelpIdToHelpSession.Unlock();
|
|
}
|
|
|
|
|
|
static HRESULT
|
|
LogoffUserHelpSessionCallback(
|
|
IN CComBSTR& bstrHelpId,
|
|
IN HANDLE userData
|
|
);
|
|
|
|
static void
|
|
NotifyHelpSesionLogoff(
|
|
DWORD dwLogonId
|
|
);
|
|
|
|
static void
|
|
NotifyExpertLogoff(
|
|
LONG ExpertSessionId,
|
|
BSTR HelpedTicketId
|
|
);
|
|
|
|
static void
|
|
NotifyPendingHelpServiceStartup();
|
|
|
|
static HRESULT
|
|
NotifyPendingHelpServiceStartCallback(
|
|
IN CComBSTR& bstrHelpId,
|
|
IN HANDLE userData
|
|
);
|
|
|
|
private:
|
|
|
|
HRESULT
|
|
LogSalemEvent(
|
|
IN long ulEventType,
|
|
IN long ulEventCode,
|
|
IN long numStrings = 0,
|
|
IN LPCTSTR* strings = NULL
|
|
);
|
|
|
|
static
|
|
RemoteDesktopHelpSessionObj*
|
|
LoadHelpSessionObj(
|
|
IN CRemoteDesktopHelpSessionMgr* pMgr,
|
|
IN BSTR bstrHelpSession,
|
|
IN BOOL bLoadExpiredHelp = FALSE
|
|
);
|
|
|
|
static HRESULT
|
|
ExpireUserHelpSessionCallback(
|
|
IN CComBSTR& pHelp,
|
|
IN HANDLE userData
|
|
);
|
|
|
|
static HRESULT
|
|
GenerateHelpSessionId(
|
|
OUT CComBSTR& bstrHelpId
|
|
);
|
|
|
|
static HRESULT
|
|
AcquireAssistantAccount();
|
|
|
|
static HRESULT
|
|
ReleaseAssistantAccount();
|
|
|
|
void
|
|
Cleanup();
|
|
|
|
HRESULT
|
|
IsUserAllowToGetHelp(
|
|
OUT BOOL* pbAllow
|
|
);
|
|
|
|
BOOL
|
|
CheckAccessRights(
|
|
IN CComObject<CRemoteDesktopHelpSession>* pIHelpSess
|
|
);
|
|
|
|
HRESULT
|
|
CreateHelpSession(
|
|
IN BOOL bCacheEntry,
|
|
IN BSTR bstrSessName,
|
|
IN BSTR bstrSessPwd,
|
|
IN BSTR bstrSessDesc,
|
|
IN BSTR bstrSessBlob,
|
|
IN LONG userLogonId,
|
|
IN BSTR bstrClientSID,
|
|
OUT RemoteDesktopHelpSessionObj** ppIRemoteDesktopHelpSession
|
|
);
|
|
|
|
HRESULT
|
|
LoadUserSid();
|
|
|
|
LONG m_LogonId;
|
|
|
|
PBYTE m_pbUserSid; // Client SID.
|
|
DWORD m_cbUserSid; // size of client SID.
|
|
CComBSTR m_bstrUserSid; // For performance reason, convert SID to string
|
|
// form once for all.
|
|
|
|
//LONG m_lAccountAcquiredByLocal; // number of reference lock this connection placed on
|
|
// help assistant account
|
|
|
|
typedef vector< CComBSTR > LocalHelpSessionCache;
|
|
|
|
// STL does not like list<CComBSTR>, CComBSTR has & defined.
|
|
//LocalHelpSessionCache m_HelpListByLocal; // ID of Help Session created by this connection.
|
|
|
|
static CCriticalSection gm_AccRefCountCS;
|
|
|
|
//
|
|
// COM create a new CRemoteDesktopHelpSessionMgr object for new connection
|
|
// so these values must be static
|
|
//
|
|
static IDToSessionMap gm_HelpIdToHelpSession;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif //__REMOTEDESKTOPHELPSESSIONMGR_H_
|