windows-nt/Source/XPSP1/NT/termsrv/remdsk/server/sessmgr/helpsess.h
2020-09-26 16:20:57 +08:00

430 lines
8.4 KiB
C++

/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
HelpSess.h
Abstract:
Declaration of the CRemoteDesktopHelpSession
Author:
HueiWang 2/17/2000
--*/
#ifndef __REMOTEDESKTOPHELPSESSION_H_
#define __REMOTEDESKTOPHELPSESSION_H_
#include "resource.h" // main symbols
#include "policy.h"
class CRemoteDesktopHelpSession;
class CRemoteDesktopHelpSessionMgr;
typedef struct __EventLogInfo {
CComBSTR bstrNoviceDomain; // Ticket owner domain.
CComBSTR bstrNoviceAccount; // Ticket owner account.
CComBSTR bstrExpertIpAddressFromClient; // IP address passed from TS client
CComBSTR bstrExpertIpAddressFromServer; // Retrieve from TermSrv, IOCTL call.
} EventLogInfo;
//#define ALLOW_ALL_ACCESS_SID _TEXT("bb6e1cb1-7ab3-4596-a7ef-c02f49dc5a90")
#define UNKNOWN_LOGONID 0xFFFFFFFF
#define UNKNOWN_LOGONID_STRING L"0"
#define HELPSESSIONFLAG_UNSOLICITEDHELP 0x80000000
/////////////////////////////////////////////////////////////////////////////
// CRemoteDesktopHelpSession
class ATL_NO_VTABLE CRemoteDesktopHelpSession :
public CComObjectRootEx<CComMultiThreadModel>,
//public CComCoClass<CRemoteDesktopHelpSession, &CLSID_RemoteDesktopHelpSession>,
public IDispatchImpl<IRemoteDesktopHelpSession, &IID_IRemoteDesktopHelpSession, &LIBID_RDSESSMGRLib>
{
friend class CRemoteDesktopHelpSessionMgr;
public:
CRemoteDesktopHelpSession();
~CRemoteDesktopHelpSession();
DECLARE_REGISTRY_RESOURCEID(IDR_REMOTEDESKTOPHELPSESSION)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CRemoteDesktopHelpSession)
COM_INTERFACE_ENTRY(IRemoteDesktopHelpSession)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
HRESULT
FinalConstruct()
{
ULONG count = _Module.AddRef();
m_bDeleted = FALSE;
DebugPrintf(
_TEXT("Module AddRef by CRemoteDesktopHelpSession() %p %d...\n"),
this,
count
);
return S_OK;
}
void
FinalRelease();
// IRemoteDesktopHelpSession
public:
STDMETHOD(get_TimeOut)(
/*[out, retval]*/ DWORD* Timeout
);
STDMETHOD(put_TimeOut)(
/*[in]*/ DWORD Timeout
);
STDMETHOD(get_HelpSessionId)(
/*[out, retval]*/ BSTR *pVal
);
STDMETHOD(get_UserLogonId)(
/*[out, retval]*/ long *pVal
);
STDMETHOD(get_AssistantAccountName)(
/*[out, retval]*/ BSTR *pVal
);
STDMETHOD(get_HelpSessionName)(
/*[out, retval]*/ BSTR *pVal
);
STDMETHOD(put_HelpSessionName)(
/*[in]*/ BSTR newVal
);
STDMETHOD(put_HelpSessionPassword)(
/*[in]*/ BSTR newVal
);
STDMETHOD(get_HelpSessionDescription)(
/*[out, retval]*/ BSTR *pVal
);
STDMETHOD(put_HelpSessionDescription)(
/*[in]*/ BSTR newVal
);
STDMETHOD(get_EnableResolver)(
/*[out, retval]*/ BOOL* pVal
);
STDMETHOD(put_EnableResolver)(
/*[in]*/ BOOL Val
);
STDMETHOD(get_HelpSessionCreateBlob)(
/*[out, retval]*/ BSTR* pVal
);
STDMETHOD(put_HelpSessionCreateBlob)(
/*[in]*/ BSTR Val
);
STDMETHOD(get_ResolverBlob)(
/*[out, retval]*/ BSTR* pVal
);
STDMETHOD(put_ResolverBlob)(
/*[in]*/ BSTR Val
);
STDMETHOD(get_UserHelpSessionRemoteDesktopSharingSetting)(
/*[out, retval]*/ REMOTE_DESKTOP_SHARING_CLASS* pLevel
);
STDMETHOD(put_UserHelpSessionRemoteDesktopSharingSetting)(
/*[in]*/ REMOTE_DESKTOP_SHARING_CLASS Level
);
STDMETHOD(get_UserPolicyRemoteDesktopSharingSetting)(
/*[out, retval]*/ REMOTE_DESKTOP_SHARING_CLASS* pLevel
)
/*++
--*/
{
DWORD dwStatus;
if( NULL == pLevel )
{
dwStatus = ERROR_INVALID_PARAMETER;
}
else if( UNKNOWN_LOGONID != m_ulLogonId )
{
dwStatus = GetUserRDSLevel( m_ulLogonId, pLevel );
}
return HRESULT_FROM_WIN32( dwStatus );
}
STDMETHOD(get_AllowToGetHelp)(
/*[out, retval]*/ BOOL* pVal
);
STDMETHOD(get_ConnectParms)(
/*[out, ret]*/ BSTR* bstrConnectParms
);
STDMETHOD(DeleteHelp)();
STDMETHOD(ResolveUserSession)(
/*[in]*/ BSTR bstrResolverBlob,
/*[in]*/ BSTR bstrExpertBlob,
/*[in]*/ LONG CallerProcessId,
/*[out]*/ ULONG_PTR* hHelpCtr,
/*[out]*/ LONG* pResolverErrCode,
/*[out, retval]*/ long* plUserSession
);
STDMETHOD(EnableUserSessionRdsSetting)(
/*[in]*/ BOOL bEnable
);
HRESULT NotifyDisconnect();
BOOL
IsHelpSessionExpired();
void
SetHelpSessionFlag(
IN ULONG flags
)
/*++
--*/
{
m_ulHelpSessionFlag = flags;
}
ULONG
GetHelpSessionFlag()
/*++
--*/
{
return m_ulHelpSessionFlag;
}
// Create an instance of help session object
static HRESULT
CreateInstance(
IN CRemoteDesktopHelpSessionMgr* pMgr,
IN CComBSTR& bstrClientSid,
IN PHELPENTRY pHelp,
OUT RemoteDesktopHelpSessionObj** ppRemoteDesktopHelpSession
);
//
// Retrieve HelpAssisant session ID which is providing help
// to this object
ULONG
GetHelperSessionId() {
return m_ulHelperSessionId;
}
//
// Convert ticket owner SID to domain\account
//
void
ResolveTicketOwner();
protected:
HRESULT
InitInstance(
IN CRemoteDesktopHelpSessionMgr* pMgr,
IN CComBSTR& bstrClientSid,
IN PHELPENTRY pHelpEntry
);
private:
void
ResolveHelperInformation(
ULONG HelperSessionId,
CComBSTR& bstrExpertIpAddressFromClient,
CComBSTR& bstrExpertIpAddressFromServer
);
HRESULT
ResolveTicketOwnerInformation(
CComBSTR& ownerSidString,
CComBSTR& Domain,
CComBSTR& UserAcc
);
VOID
SetHelperSessionId( ULONG HelperSessionId ) {
m_ulHelperSessionId = HelperSessionId;
return;
}
BOOL
IsClientSessionCreator();
BOOL
IsSessionValid()
{
return (FALSE == m_bDeleted && NULL != m_pHelpSession);
}
HRESULT
ActivateSessionRDSSetting();
HRESULT
ResetSessionRDSSetting();
HRESULT
BeginUpdate();
HRESULT
CommitUpdate();
HRESULT
AbortUpdate();
HRESULT
put_UserLogonId(
IN long newVal
);
HRESULT
put_ICSPort(
IN DWORD newVal
);
HRESULT
put_UserSID(
IN BSTR bstrUserSID
)
/*++
--*/
{
HRESULT hRes = S_OK;
MYASSERT( m_pHelpSession->m_UserSID->Length() == 0 );
m_pHelpSession->m_UserSID = bstrUserSID;
if( !((CComBSTR)m_pHelpSession->m_UserSID == bstrUserSID) )
{
hRes = E_OUTOFMEMORY;
}
return hRes;
}
BOOL
IsEqualSid(
IN const CComBSTR& bstrSid
);
BOOL
IsCreatedByUserSession(
IN const long lUserSessionId
)
/*++
--*/
{
return m_ulLogonId == lUserSessionId;
}
BOOL
VerifyUserSession(
IN const CComBSTR& bstrUserSid,
IN const CComBSTR& bstrSessPwd
);
BOOL
IsUnsolicitedHelp()
{
DebugPrintf(
_TEXT("Help Session Flag : 0x%08x\n"),
m_ulHelpSessionFlag
);
return (m_ulHelpSessionFlag & HELPSESSIONFLAG_UNSOLICITEDHELP);
}
//
// Help Session Object Lock.
//
CCriticalSection m_HelpSessionLock;
//
// Pointer to Help Entry in registry
//
PHELPENTRY m_pHelpSession;
//
// TS session ID or 0xFFFFFFFF
//
ULONG m_ulLogonId;
CRemoteDesktopHelpSessionMgr* m_pSessMgr;
BOOL m_bDeleted;
//
// calling client SID
//
CComBSTR m_bstrClientSid;
//
// Following is cached in this object in case our help is
// expired.
//
CComBSTR m_bstrHelpSessionId;
CComBSTR m_ResolverConnectBlob;
CComBSTR m_HelpSessionOwnerSid;
//
// HelpAssistant session ID that is providing
// help to this object or is pending user acceptance on
// invitation
//
ULONG m_ulHelperSessionId;
//
// Cached ticket owner (domain\user account) and
// helper information for event logging
//
EventLogInfo m_EventLogInfo;
//
// Various flag for this session
//
ULONG m_ulHelpSessionFlag;
};
#endif //__REMOTEDESKTOPHELPSESSION_H_