193 lines
5.4 KiB
C++
193 lines
5.4 KiB
C++
#pragma once
|
|
|
|
#include <windows.h>
|
|
#include <objbase.h>
|
|
#include <objsel.h>
|
|
#include <shlobj.h>
|
|
|
|
//
|
|
#define TSCFG_MUTEXNAME TEXT("Global\\TerminalServerConfigMutex")
|
|
|
|
//***************************************************************************************
|
|
//class CRemoteUsersDialog
|
|
//***************************************************************************************
|
|
class CRemoteUsersDialog
|
|
{
|
|
private:
|
|
HINSTANCE m_hInst;
|
|
HWND m_hDlg;
|
|
HWND m_hList;
|
|
WCHAR m_szRemoteGroupName[MAX_PATH+1];
|
|
WCHAR m_szLocalCompName[MAX_PATH+1];
|
|
BOOL m_bCanShowDialog;
|
|
//image indexes
|
|
int m_iLocUser,m_iGlobUser,m_iLocGroup,m_iGlobGroup,m_iUnknown;
|
|
public:
|
|
CRemoteUsersDialog(HINSTANCE hInst);
|
|
INT_PTR DoDialog(HWND hwndParent);
|
|
BOOL CanShowDialog(LPBOOL pbAccessDenied);
|
|
void OnInitDialog(HWND hDlg);
|
|
void OnLink(WPARAM wParam);
|
|
BOOL OnOk();
|
|
void OnItemChanged(LPARAM lParam);
|
|
void OnDestroyWindow();
|
|
void AddUsers();
|
|
void RemoveUsers();
|
|
private:
|
|
void AddPickerItems(DS_SELECTION_LIST *selections);
|
|
int FindItemBySid(PSID pSid);
|
|
void ReloadList();
|
|
BOOL IsLocal(LPWSTR wszDomainandname);
|
|
void InitAccessMessage();
|
|
|
|
};
|
|
|
|
INT_PTR APIENTRY RemoteUsersDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
//***************************************************************************************
|
|
//class CRemotePage
|
|
//***************************************************************************************
|
|
class CRemotePage : public IShellExtInit, IShellPropSheetExt
|
|
{
|
|
private:
|
|
//reference counter
|
|
ULONG m_cref;
|
|
|
|
BOOL m_bProfessional;
|
|
DWORD m_dwPageType;
|
|
HINSTANCE m_hInst;
|
|
HWND m_hDlg;
|
|
DWORD m_dwInitialState;
|
|
BOOL m_bDisableChkBox;
|
|
BOOL m_bDisableButtons;
|
|
BOOL m_bShowAccessDeniedWarning;
|
|
WORD m_TemplateId;
|
|
|
|
CRemoteUsersDialog m_RemoteUsersDialog;
|
|
public:
|
|
|
|
CRemotePage(HINSTANCE hinst);
|
|
~CRemotePage();
|
|
///////////////////////////////
|
|
// Interface IUnknown
|
|
///////////////////////////////
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
///////////////////////////////
|
|
// Interface IShellExtInit
|
|
///////////////////////////////
|
|
STDMETHODIMP Initialize(LPCITEMIDLIST , LPDATAOBJECT , HKEY );
|
|
|
|
///////////////////////////////
|
|
// Interface IShellPropSheetExt
|
|
///////////////////////////////
|
|
STDMETHODIMP AddPages( LPFNADDPROPSHEETPAGE , LPARAM );
|
|
STDMETHODIMP ReplacePage( UINT , LPFNADDPROPSHEETPAGE , LPARAM );
|
|
|
|
///////////////////////////////
|
|
// Internal functions
|
|
///////////////////////////////
|
|
void OnInitDialog(HWND hDlg);
|
|
void OnSetActive();
|
|
BOOL OnApply();
|
|
void OnLink(WPARAM wParam);
|
|
BOOL OnRemoteEnable();
|
|
void OnRemoteSelectUsers();
|
|
void RemoteEnableWarning();
|
|
private:
|
|
BOOL CanShowRemotePage();
|
|
|
|
};
|
|
|
|
INT_PTR APIENTRY RemoteDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
#define PAGE_TYPE_UNKNOWN 0
|
|
#define PAGE_TYPE_PTS 1
|
|
#define PAGE_TYPE_APPSERVER 2
|
|
#define PAGE_TYPE_PERSONAL 3
|
|
|
|
//***************************************************************************************
|
|
//class CWaitCursor
|
|
//***************************************************************************************
|
|
class CWaitCursor
|
|
{
|
|
private:
|
|
HCURSOR m_hOldCursor;
|
|
public:
|
|
CWaitCursor()
|
|
{
|
|
m_hOldCursor=SetCursor(LoadCursor(NULL,IDC_WAIT));
|
|
}
|
|
~CWaitCursor()
|
|
{
|
|
SetCursor(m_hOldCursor);
|
|
}
|
|
};
|
|
|
|
//***************************************************************************************
|
|
//class CMutex
|
|
//***************************************************************************************
|
|
class CMutex
|
|
{
|
|
private:
|
|
HANDLE m_hMutex;
|
|
public:
|
|
CMutex() : m_hMutex(NULL)
|
|
{
|
|
m_hMutex=CreateMutex(NULL,TRUE,TSCFG_MUTEXNAME);
|
|
if(m_hMutex)
|
|
{
|
|
//wait up to 30 sec.
|
|
WaitForSingleObject(m_hMutex,30000);
|
|
}
|
|
}
|
|
~CMutex()
|
|
{
|
|
if(m_hMutex)
|
|
{
|
|
ReleaseMutex(m_hMutex);
|
|
CloseHandle(m_hMutex);
|
|
}
|
|
}
|
|
};
|
|
|
|
//***************************************************************************************
|
|
//class COfflineFilesDialog
|
|
//***************************************************************************************
|
|
class COfflineFilesDialog
|
|
{
|
|
private:
|
|
HINSTANCE m_hInst;
|
|
HWND m_hDlg;
|
|
public:
|
|
COfflineFilesDialog(HINSTANCE hInst);
|
|
INT_PTR DoDialog(HWND hwndParent);
|
|
void OnInitDialog(HWND hDlg);
|
|
void OnLink(WPARAM wParam);
|
|
};
|
|
|
|
INT_PTR APIENTRY OfflineFilesDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
//***************************************************************************************
|
|
//Global functions
|
|
//***************************************************************************************
|
|
BOOL
|
|
getGroupMembershipPickerSettings(
|
|
DSOP_SCOPE_INIT_INFO*& infos,
|
|
ULONG& infoCount);
|
|
|
|
HRESULT VariantToSid(VARIANT* var, PSID *ppSid);
|
|
|
|
BOOL TestUserForAdmin();
|
|
|
|
void DisplayError(HINSTANCE hInst, HWND hDlg, UINT ErrID, UINT MsgID, UINT TitleID, ...);
|
|
|
|
BOOL LookupSid(IN PSID pSid, OUT LPWSTR *ppName, OUT SID_NAME_USE *peUse);
|
|
|
|
BOOL GetTokenUserName(IN HANDLE hToken,OUT LPWSTR *ppName);
|
|
|
|
BOOL GetRDPSecurityDescriptor(OUT PSECURITY_DESCRIPTOR *ppSD);
|
|
|
|
BOOL CheckWinstationLogonAccess(IN HANDLE hToken,IN PSECURITY_DESCRIPTOR pSD); |