windows-nt/Source/XPSP1/NT/ds/security/gina/snapins/gpedit/rsoproot.cpp
2020-09-26 16:20:57 +08:00

16890 lines
461 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1997.
//
// File: rsoproot.cpp
//
// Contents: implementation of root RSOP snap-in node
//
// Classes: CRSOPComponentDataCF
// CRSOPComponentData
//
// Functions:
//
// History: 09-13-1999 stevebl Created
//
//---------------------------------------------------------------------------
#include "main.h"
#include "objsel.h" // for the object picker
#include "rsoputil.h"
#include <ntdsapi.h> // for the Ds*DomainController* API
#include "sddl.h" // for sid to string functions
unsigned int CRSOPCMenu::m_cfDSObjectName = RegisterClipboardFormat(CFSTR_DSOBJECTNAMES);
//
// Help ids
//
DWORD aBrowseForOUHelpIds[] =
{
DSBID_BANNER, IDH_RSOP_BANNER,
DSBID_CONTAINERLIST, IDH_RSOP_CONTAINERLIST,
0, 0
};
DWORD aGPOListHelpIds[] =
{
IDC_LIST1, IDH_RSOP_GPOLIST,
IDC_CHECK1, IDH_RSOP_GPOSOM,
IDC_CHECK2, IDH_RSOP_APPLIEDGPOS,
IDC_CHECK3, IDH_RSOP_REVISION,
IDC_BUTTON1, IDH_RSOP_SECURITY,
IDC_BUTTON2, IDH_RSOP_EDIT,
0, 0
};
DWORD aErrorsHelpIds[] =
{
IDC_LIST1, IDH_RSOP_COMPONENTLIST,
IDC_EDIT1, IDH_RSOP_COMPONENTDETAILS,
IDC_BUTTON1, IDH_RSOP_SAVEAS,
0, 0
};
DWORD aQueryHelpIds[] =
{
IDC_LIST1, IDH_RSOP_QUERYLIST,
0, 0
};
DWORD aBrowseDCHelpIds[] =
{
IDC_LIST1, IDH_RSOP_BROWSEDC,
0, 0
};
BSTR ParseDomainName( LPWSTR szDSObject );
//************************************************************************
// ParseDN
//
// Purpose: Parses the given name to get the pieces.
//
// Parameters:
// lpDSObject - Path to the DS Obkect in the format LDAP://<DC-Name>/DN
// pwszDomain - Returns the <DC-Name>. This is allocated in the fn.
// pszDN - The DN part of lpDSObject
// szSOM - THe actual SOM (the node on which we have the rsop rights on
//
// No return value. If memory couldn't be allocated for the pwszDomain it is returned as NULL
//
//************************************************************************
void ParseDN(LPWSTR lpDSObject, LPWSTR *pwszDomain, LPWSTR *pszDN, LPWSTR *szSOM)
{
LPWSTR szContainer = lpDSObject;
LPWSTR lpEnd = NULL;
*pszDN = szContainer;
if (CompareString (LOCALE_USER_DEFAULT, NORM_STOP_ON_NULL, TEXT("LDAP://"),
7, szContainer, 7) != CSTR_EQUAL)
{
DebugMsg((DM_WARNING, TEXT("GetSOMFromDN: Object does not start with LDAP://")));
return;
}
szContainer += 7;
lpEnd = szContainer;
//
// Move till the end of the domain name
//
*pwszDomain = NULL;
while (*lpEnd && (*lpEnd != TEXT('/'))) {
lpEnd++;
}
if (*lpEnd == TEXT('/')) {
*pwszDomain = (LPWSTR)LocalAlloc(LPTR, sizeof(WCHAR)*( (lpEnd - szContainer) + 1));
if (*pwszDomain) {
wcsncpy(*pwszDomain, szContainer, (lpEnd - szContainer));
}
szContainer = lpEnd + 1;
}
*pszDN = szContainer;
while (*szContainer) {
//
// See if the DN name starts with OU=
//
if (CompareString (LOCALE_USER_DEFAULT, NORM_IGNORECASE,
szContainer, 3, TEXT("OU="), 3) == CSTR_EQUAL) {
break;
}
//
// See if the DN name starts with DC=
//
else if (CompareString (LOCALE_USER_DEFAULT, NORM_IGNORECASE,
szContainer, 3, TEXT("DC="), 3) == CSTR_EQUAL) {
break;
}
//
// Move to the next chunk of the DN name
//
while (*szContainer && (*szContainer != TEXT(','))) {
szContainer++;
}
if (*szContainer == TEXT(',')) {
szContainer++;
}
}
*szSOM = szContainer;
return;
}
BOOL IsPlanningModeAllowed()
{
//
// Check the SKU to see if planning is allowed -- it
// is not implemented for the pro SKU
//
OSVERSIONINFOEXW version;
version.dwOSVersionInfoSize = sizeof(version);
if ( GetVersionEx( (LPOSVERSIONINFO) &version ) )
{
if ( version.wProductType != VER_NT_WORKSTATION )
{
//
// This is a non-pro SKU, so we allow planning mode
//
return TRUE;
}
}
return FALSE;
}
//*************************************************************
//
// MyTranslateName()
//
// Purpose: Gets the user name in the requested format
//
// Return: lpUserName if successful
// NULL if an error occurs
//
// Allocates and retries with the appropriate buffer size
//
//*************************************************************
LPTSTR MyTranslateName (LPTSTR lpAccName, EXTENDED_NAME_FORMAT NameFormat, EXTENDED_NAME_FORMAT desiredNameFormat)
{
DWORD dwError = ERROR_SUCCESS;
LPTSTR lpUserName = NULL, lpTemp;
ULONG ulUserNameSize;
//
// Allocate a buffer for the user name
//
ulUserNameSize = 75;
if (desiredNameFormat == NameFullyQualifiedDN) {
ulUserNameSize = 200;
}
lpUserName = (LPTSTR) LocalAlloc (LPTR, ulUserNameSize * sizeof(TCHAR));
if (!lpUserName) {
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("MyGetUserName: Failed to allocate memory with %d"),
dwError));
goto Exit;
}
//
// Get the username in the requested format
//
if (!TranslateName (lpAccName, NameFormat, desiredNameFormat, lpUserName, &ulUserNameSize)) {
//
// If the call failed due to insufficient memory, realloc
// the buffer and try again. Otherwise, exit now.
//
dwError = GetLastError();
if (dwError != ERROR_INSUFFICIENT_BUFFER) {
DebugMsg((DM_WARNING, TEXT("MyGetTranslateName: TranslateName failed with %d"),
dwError));
LocalFree (lpUserName);
lpUserName = NULL;
goto Exit;
}
lpTemp = (LPTSTR) LocalReAlloc (lpUserName, (ulUserNameSize * sizeof(TCHAR)),
LMEM_MOVEABLE);
if (!lpTemp) {
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("MyGetTranslateName: Failed to realloc memory with %d"),
dwError));
LocalFree (lpUserName);
lpUserName = NULL;
goto Exit;
}
lpUserName = lpTemp;
if (!TranslateName (lpAccName, NameFormat, desiredNameFormat, lpUserName, &ulUserNameSize)) {
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("MyGetTranslateName: TranslateName failed with %d"),
dwError));
LocalFree (lpUserName);
lpUserName = NULL;
goto Exit;
}
dwError = ERROR_SUCCESS;
}
Exit:
SetLastError(dwError);
return lpUserName;
}
//*************************************************************
//
// MyLookupAccountName()
//
// Purpose: Gets the SID of the user
//
// Parameters:
// szSystemName: Machine where the account should be resolved
// szAccName: The actual account name
//
// Return: lpUserName if successful
// NULL if an error occurs
//
// Allocates and retries with the appropriate buffer size
//*************************************************************
LPTSTR MyLookupAccountName(LPTSTR szSystemName, LPTSTR szAccName)
{
PSID pSid = NULL;
DWORD cSid = 0, cbDomain = 0;
SID_NAME_USE peUse;
LPTSTR lpSidString = NULL, szDomain = NULL;
DWORD dwErr = 0;
BOOL bRet = FALSE;
LookupAccountName(szSystemName, szAccName, NULL, &cSid, NULL, &cbDomain, &peUse);
pSid = (PSID)LocalAlloc(LPTR, cSid);
szDomain = (LPTSTR) LocalAlloc(LPTR, cbDomain*(sizeof(TCHAR)));
if (!pSid || !szDomain) {
return NULL;
}
if (!LookupAccountName(szSystemName, szAccName, pSid, &cSid, szDomain, &cbDomain, &peUse)) {
DebugMsg((DM_WARNING, TEXT("MyLookupAccountName: LookupAccountName failed with %d"),
GetLastError()));
dwErr = GetLastError();
goto Exit;
}
if (!ConvertSidToStringSid(pSid, &lpSidString)) {
DebugMsg((DM_WARNING, TEXT("MyLookupAccountName: ConvertSidToStringSid failed with %d"),
GetLastError()));
dwErr = GetLastError();
goto Exit;
}
bRet = TRUE;
Exit:
if (pSid) {
LocalFree(pSid);
}
if (szDomain) {
LocalFree(szDomain);
}
if (!bRet) {
SetLastError(dwErr);
return NULL;
}
else {
return lpSidString;
}
}
WCHAR * NameWithoutDomain(WCHAR * szName)
{
// The name passed in could be of the form
// "domain/name"
// or it could be just
// "name"
int cch = 0;
if (NULL != szName)
{
while (szName[cch])
{
if (szName[cch] == L'/' || szName[cch] == L'\\')
{
return &szName[cch + 1];
}
cch++;
}
}
return szName;
}
WCHAR* NormalizedComputerName(WCHAR * szComputerName )
{
TCHAR* szNormalizedComputerName;
// Computer names may start with '\\', so we will return
// the computer name without that prefix if it exists
szNormalizedComputerName = szComputerName;
if ( szNormalizedComputerName )
{
// Make sure that the computer name string is at least 2 characters in length --
// if the first character is non-zero, we know the second character must exist
// since this is a zero terminated string -- in this case, it is safe to compare
// the first 2 characters
if ( *szNormalizedComputerName )
{
if ( ( TEXT('\\') == szNormalizedComputerName[0] ) &&
( TEXT('\\') == szNormalizedComputerName[1] ) )
{
szNormalizedComputerName += 2;
}
}
}
return szNormalizedComputerName;
}
CRSOPComponentData::CRSOPComponentData()
{
InterlockedIncrement(&g_cRefThisDll);
m_cRef = 1;
m_hwndFrame = NULL;
m_bOverride = FALSE;
m_bDirty = FALSE;
m_bRefocusInit = FALSE;
m_bArchiveData = FALSE;
m_bViewIsArchivedData = FALSE;
m_pScope = NULL;
m_pConsole = NULL;
m_hRoot = NULL;
m_hMachine = NULL;
m_hUser = NULL;
m_pDisplayName = NULL;
m_bDiagnostic = FALSE;
m_szNamespace = NULL;
m_bInitialized = FALSE;
m_szComputerName = NULL;
m_szComputerDNName = NULL;
m_szComputerSOM = NULL;
m_szDefaultComputerSOM = NULL;
m_saComputerSecurityGroups = NULL;
m_saDefaultComputerSecurityGroups = NULL;
m_saComputerSecurityGroupsAttr = NULL;
m_saDefaultComputerSecurityGroupsAttr = NULL;
m_saComputerWQLFilters = NULL;
m_saComputerWQLFilterNames = NULL;
m_saDefaultComputerWQLFilters = NULL;
m_saDefaultComputerWQLFilterNames = NULL;
m_pComputerObject = NULL;
m_bNoComputerData = FALSE;
m_bComputerDeniedAccess = FALSE;
m_szSite = NULL;
m_szDC = NULL;
m_bSlowLink = FALSE;
m_loopbackMode = LoopbackNone;
m_szUserName = NULL;
m_szUserDNName = NULL;
m_szUserDisplayName = NULL;
m_szUserSOM = NULL;
m_szDefaultUserSOM = NULL;
m_saUserSecurityGroups = NULL;
m_saUserSecurityGroupsAttr = NULL;
m_saDefaultUserSecurityGroups = NULL;
m_saDefaultUserSecurityGroupsAttr = NULL;
m_saUserWQLFilters = NULL;
m_saUserWQLFilterNames = NULL;
m_saDefaultUserWQLFilters = NULL;
m_saDefaultUserWQLFilterNames = NULL;
m_pUserObject = NULL;
m_bNoUserData = FALSE;
m_bUserDeniedAccess = FALSE;
m_dwSkippedFrom = 0;
m_hChooseBitmap = NULL;
m_pUserGPOList = NULL;
m_pComputerGPOList = NULL;
m_pUserCSEList = NULL;
m_pComputerCSEList = NULL;
m_bUserCSEError = FALSE;
m_bComputerCSEError = FALSE;
m_bUserGPCoreError = FALSE;
m_bComputerGPCoreError = FALSE;
m_szUserSOMPref = NULL;
m_szComputerSOMPref = NULL;
m_szUserNamePref = NULL;
m_szComputerNamePref = NULL;
m_szSitePref = NULL;
m_szDCPref = NULL;
m_bSkipUserWQLFilter = TRUE;
m_bSkipComputerWQLFilter = TRUE;
m_dwLoadFlags = RSOP_NOMSC;
m_pEvents = new CEvents;
m_hRichEdit = LoadLibrary (TEXT("riched20.dll"));
m_BigBoldFont = NULL;
m_BoldFont = NULL;
}
CRSOPComponentData::~CRSOPComponentData()
{
FreeUserData();
FreeComputerData();
if (m_pEvents)
{
delete m_pEvents;
}
if (m_pUserCSEList)
{
FreeCSEData (m_pUserCSEList);
}
if (m_pComputerCSEList)
{
FreeCSEData (m_pComputerCSEList);
}
if (m_pUserGPOList)
{
FreeGPOListData (m_pUserGPOList);
}
if (m_pComputerGPOList)
{
FreeGPOListData (m_pComputerGPOList);
}
if (m_szSite)
{
delete [] m_szSite;
}
if (m_szDC)
{
delete [] m_szDC;
}
if (m_pDisplayName)
{
delete [] m_pDisplayName;
}
if (m_szNamespace)
{
delete [] m_szNamespace;
}
if (m_szUserSOMPref)
LocalFree(m_szUserSOMPref);
if (m_szComputerSOMPref)
LocalFree(m_szComputerSOMPref);
if (m_szUserNamePref)
LocalFree(m_szUserNamePref);
if (m_szComputerNamePref)
LocalFree(m_szComputerNamePref);
if (m_szSitePref)
LocalFree(m_szSitePref);
if (m_szDCPref)
LocalFree(m_szDCPref);
if (m_hChooseBitmap)
{
DeleteObject (m_hChooseBitmap);
}
if (m_pScope)
{
m_pScope->Release();
}
if (m_pConsole)
{
m_pConsole->Release();
}
if (m_hRichEdit)
{
FreeLibrary (m_hRichEdit);
}
if ( m_BoldFont )
{
DeleteObject(m_BoldFont); m_BoldFont = NULL;
}
if ( m_BoldFont )
{
DeleteObject(m_BigBoldFont); m_BigBoldFont = NULL;
}
InterlockedDecrement(&g_cRefThisDll);
}
VOID CRSOPComponentData::FreeUserData (VOID)
{
if (m_szUserName)
{
delete [] m_szUserName;
m_szUserName = NULL;
}
if (m_szUserDNName)
{
delete [] m_szUserDNName;
m_szUserDNName = NULL;
}
if (m_szUserDisplayName)
{
delete [] m_szUserDisplayName;
m_szUserDisplayName = NULL;
}
if (m_szUserSOM)
{
delete [] m_szUserSOM;
m_szUserSOM = NULL;
}
if (m_szDefaultUserSOM)
{
delete [] m_szDefaultUserSOM;
m_szDefaultUserSOM = NULL;
}
if (m_saUserSecurityGroups)
{
SafeArrayDestroy (m_saUserSecurityGroups);
m_saUserSecurityGroups = NULL;
}
if (m_saUserSecurityGroupsAttr)
{
LocalFree(m_saUserSecurityGroupsAttr);
m_saUserSecurityGroupsAttr = NULL;
}
if (m_saDefaultUserSecurityGroups)
{
SafeArrayDestroy (m_saDefaultUserSecurityGroups);
m_saDefaultUserSecurityGroups = NULL;
}
if (m_saDefaultUserSecurityGroupsAttr)
{
LocalFree (m_saDefaultUserSecurityGroupsAttr);
m_saDefaultUserSecurityGroupsAttr = NULL;
}
if (m_saUserWQLFilters)
{
SafeArrayDestroy (m_saUserWQLFilters);
m_saUserWQLFilters = NULL;
}
if (m_saUserWQLFilterNames)
{
SafeArrayDestroy (m_saUserWQLFilterNames);
m_saUserWQLFilterNames = NULL;
}
if (m_saDefaultUserWQLFilters)
{
SafeArrayDestroy (m_saDefaultUserWQLFilters);
m_saDefaultUserWQLFilters = NULL;
}
if (m_saDefaultUserWQLFilterNames)
{
SafeArrayDestroy (m_saDefaultUserWQLFilterNames);
m_saDefaultUserWQLFilterNames = NULL;
}
m_bSkipUserWQLFilter = TRUE;
if (m_pUserObject)
{
m_pUserObject->Release();
m_pUserObject = NULL;
}
}
VOID CRSOPComponentData::FreeComputerData (VOID)
{
if (m_szComputerName)
{
delete [] m_szComputerName;
m_szComputerName = NULL;
}
if (m_szComputerDNName)
{
delete [] m_szComputerDNName;
m_szComputerDNName = NULL;
}
if (m_szComputerSOM)
{
delete [] m_szComputerSOM;
m_szComputerSOM = NULL;
}
if (m_szDefaultComputerSOM)
{
delete [] m_szDefaultComputerSOM;
m_szDefaultComputerSOM = NULL;
}
if (m_saComputerSecurityGroups)
{
SafeArrayDestroy (m_saComputerSecurityGroups);
m_saComputerSecurityGroups = NULL;
}
if (m_saDefaultComputerSecurityGroups)
{
SafeArrayDestroy (m_saDefaultComputerSecurityGroups);
m_saDefaultComputerSecurityGroups = NULL;
}
if (m_saComputerSecurityGroupsAttr)
{
LocalFree (m_saComputerSecurityGroupsAttr);
m_saComputerSecurityGroupsAttr = NULL;
}
if (m_saDefaultComputerSecurityGroupsAttr)
{
LocalFree (m_saDefaultComputerSecurityGroupsAttr);
m_saDefaultComputerSecurityGroupsAttr = NULL;
}
if (m_saComputerWQLFilters)
{
SafeArrayDestroy (m_saComputerWQLFilters);
m_saComputerWQLFilters = NULL;
}
if (m_saComputerWQLFilterNames)
{
SafeArrayDestroy (m_saComputerWQLFilterNames);
m_saComputerWQLFilterNames = NULL;
}
if (m_saDefaultComputerWQLFilters)
{
SafeArrayDestroy (m_saDefaultComputerWQLFilters);
m_saDefaultComputerWQLFilters = NULL;
}
if (m_saDefaultComputerWQLFilterNames)
{
SafeArrayDestroy (m_saDefaultComputerWQLFilterNames);
m_saDefaultComputerWQLFilterNames = NULL;
}
m_bSkipComputerWQLFilter = TRUE;
if (m_pComputerObject)
{
m_pComputerObject->Release();
m_pComputerObject = NULL;
}
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (IUnknown) //
// //
///////////////////////////////////////////////////////////////////////////////
HRESULT CRSOPComponentData::QueryInterface (REFIID riid, void **ppv)
{
if (IsEqualIID(riid, IID_IComponentData) || IsEqualIID(riid, IID_IUnknown))
{
*ppv = (LPCOMPONENT)this;
m_cRef++;
return S_OK;
}
else if (IsEqualIID(riid, IID_IExtendPropertySheet2))
{
*ppv = (LPEXTENDPROPERTYSHEET)this;
m_cRef++;
return S_OK;
}
else if (IsEqualIID(riid, IID_IExtendContextMenu))
{
*ppv = (LPEXTENDCONTEXTMENU)this;
m_cRef++;
return S_OK;
}
else if (IsEqualIID(riid, IID_IPersistStreamInit))
{
*ppv = (LPPERSISTSTREAMINIT)this;
m_cRef++;
return S_OK;
}
else if (IsEqualIID(riid, IID_ISnapinHelp))
{
*ppv = (LPSNAPINHELP)this;
m_cRef++;
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
ULONG CRSOPComponentData::AddRef (void)
{
return ++m_cRef;
}
ULONG CRSOPComponentData::Release (void)
{
if (--m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
STDMETHODIMP CRSOPComponentData::GetNamespace (DWORD dwSection, LPOLESTR pszName, int cchMaxLength)
{
TCHAR szPath[2*MAX_PATH];
LPTSTR lpEnd;
//
// Check parameters
//
if (!pszName || (cchMaxLength <= 0))
return E_INVALIDARG;
if (!m_bInitialized)
{
return OLE_E_BLANK;
}
if ((dwSection != GPO_SECTION_ROOT) &&
(dwSection != GPO_SECTION_USER) &&
(dwSection != GPO_SECTION_MACHINE))
return E_INVALIDARG;
//
// Build the path
//
lstrcpy (szPath, m_szNamespace);
if (dwSection != GPO_SECTION_ROOT)
{
if (dwSection == GPO_SECTION_USER)
{
lpEnd = CheckSlash (szPath);
lstrcpy (lpEnd, USER_SECTION);
}
else if (dwSection == GPO_SECTION_MACHINE)
{
lpEnd = CheckSlash (szPath);
lstrcpy (lpEnd, COMPUTER_SECTION);
}
else
{
return E_INVALIDARG;
}
}
//
// Save the name
//
if ((lstrlen (szPath) + 1) <= cchMaxLength)
{
lstrcpy (pszName, szPath);
return S_OK;
}
return E_OUTOFMEMORY;
}
STDMETHODIMP CRSOPComponentData::GetFlags (DWORD * pdwFlags)
{
if (!pdwFlags)
{
return E_INVALIDARG;
}
*pdwFlags = m_bDiagnostic ? RSOP_INFO_FLAG_DIAGNOSTIC_MODE : 0;
return S_OK;
}
STDMETHODIMP CRSOPComponentData::GetEventLogEntryText (LPOLESTR pszEventSource,
LPOLESTR pszEventLogName,
LPOLESTR pszEventTime,
DWORD dwEventID,
LPOLESTR *ppszText)
{
return (m_pEvents ? m_pEvents->GetEventLogEntryText(pszEventSource, pszEventLogName, pszEventTime,
dwEventID, ppszText) : E_NOINTERFACE);
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (IComponentData) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CRSOPComponentData::Initialize(LPUNKNOWN pUnknown)
{
HRESULT hr;
HBITMAP bmp16x16;
HBITMAP hbmp32x32;
LPIMAGELIST lpScopeImage;
//
// QI for IConsoleNameSpace
//
hr = pUnknown->QueryInterface(IID_IConsoleNameSpace, (LPVOID *)&m_pScope);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Initialize: Failed to QI for IConsoleNameSpace.")));
return hr;
}
//
// QI for IConsole
//
hr = pUnknown->QueryInterface(IID_IConsole, (LPVOID *)&m_pConsole);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Initialize: Failed to QI for IConsole.")));
m_pScope->Release();
m_pScope = NULL;
return hr;
}
m_pConsole->GetMainWindow (&m_hwndFrame);
//
// Query for the scope imagelist interface
//
hr = m_pConsole->QueryScopeImageList(&lpScopeImage);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Initialize: Failed to QI for scope imagelist.")));
m_pScope->Release();
m_pScope = NULL;
m_pConsole->Release();
m_pConsole=NULL;
return hr;
}
// Load the bitmaps from the dll
bmp16x16=LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_16x16));
hbmp32x32 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_32x32));
// Set the images
lpScopeImage->ImageListSetStrip(reinterpret_cast<LONG_PTR *>(bmp16x16),
reinterpret_cast<LONG_PTR *>(hbmp32x32),
0, RGB(255, 0, 255));
lpScopeImage->Release();
return S_OK;
}
STDMETHODIMP CRSOPComponentData::Destroy(VOID)
{
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
BSTR bstrParam = NULL;
LPTSTR lpTemp = NULL;
BSTR bstrTemp = NULL;
HRESULT hr = S_OK;
if (m_bInitialized)
{
if (m_bViewIsArchivedData)
{
//
// Delete the namespace
//
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pLocator);
if (FAILED(hr))
{
goto Cleanup;
}
//
// Delete the namespace we created when loading the data
//
bstrParam = SysAllocString(TEXT("\\\\.\\root\\rsop"));
if (!bstrParam)
{
hr = E_FAIL;
goto Cleanup;
}
hr = pLocator->ConnectServer(bstrParam,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
goto Cleanup;
}
//
// Allocate a temp buffer to store the fully qualified path in
//
lpTemp = new TCHAR [(lstrlen(m_szArchivedDataGuid) + 30)];
if (!lpTemp)
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Cleanup;
}
wsprintf (lpTemp, TEXT("__Namespace.name=\"%ws\""), m_szArchivedDataGuid);
//
// Delete the namespace
//
bstrTemp = SysAllocString (lpTemp);
if (!bstrTemp)
{
hr = E_FAIL;
goto Cleanup;
}
hr = pNamespace->DeleteInstance( bstrTemp, 0, NULL, NULL);
Cleanup:
if (lpTemp)
{
delete [] lpTemp;
}
if (bstrTemp)
{
SysFreeString(bstrTemp);
}
if (bstrParam)
{
SysFreeString(bstrParam);
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
}
else
{
hr = DeleteRSOPData (m_szNamespace);
}
if (SUCCEEDED(hr))
{
m_bInitialized = FALSE;
}
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Destroy: Failed to delete namespace with 0x%x"), hr ));
}
return hr;
}
STDMETHODIMP CRSOPComponentData::CreateComponent(LPCOMPONENT *ppComponent)
{
HRESULT hr;
CRSOPSnapIn *pSnapIn;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::CreateComponent: Entering.")));
//
// Initialize
//
*ppComponent = NULL;
//
// Create the snapin view
//
pSnapIn = new CRSOPSnapIn(this);
if (!pSnapIn)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateComponent: Failed to create CRSOPSnapIn.")));
return E_OUTOFMEMORY;
}
//
// QI for IComponent
//
hr = pSnapIn->QueryInterface(IID_IComponent, (LPVOID *)ppComponent);
pSnapIn->Release(); // release QI
return hr;
}
STDMETHODIMP CRSOPComponentData::QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type,
LPDATAOBJECT* ppDataObject)
{
HRESULT hr = E_NOINTERFACE;
CRSOPDataObject *pDataObject;
LPRSOPDATAOBJECT pRSOPDataObject;
//
// Create a new DataObject
//
pDataObject = new CRSOPDataObject(this); // ref == 1
if (!pDataObject)
return E_OUTOFMEMORY;
//
// QI for the private RSOPDataObject interface so we can set the cookie
// and type information.
//
hr = pDataObject->QueryInterface(IID_IRSOPDataObject, (LPVOID *)&pRSOPDataObject);
if (FAILED(hr))
{
pDataObject->Release();
return(hr);
}
pRSOPDataObject->SetType(type);
pRSOPDataObject->SetCookie(cookie);
pRSOPDataObject->Release();
//
// QI for a normal IDataObject to return.
//
hr = pDataObject->QueryInterface(IID_IDataObject, (LPVOID *)ppDataObject);
pDataObject->Release(); // release initial ref
return hr;
}
STDMETHODIMP CRSOPComponentData::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
{
HRESULT hr = S_OK;
switch (event)
{
case MMCN_EXPAND:
if (arg == TRUE)
hr = EnumerateScopePane(lpDataObject, (HSCOPEITEM)param);
break;
case MMCN_PRELOAD:
if (!m_bRefocusInit)
{
SCOPEDATAITEM item;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::Notify: Received MMCN_PRELOAD event.")));
m_bRefocusInit = TRUE;
ZeroMemory (&item, sizeof(SCOPEDATAITEM));
item.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE;
item.displayname = MMC_CALLBACK;
if (m_bInitialized)
{
if (m_bUserGPCoreError || m_bComputerGPCoreError)
{
item.nImage = 3;
item.nOpenImage = 3;
}
else if (m_bUserCSEError || m_bComputerCSEError ||
m_bUserDeniedAccess || m_bComputerDeniedAccess)
{
item.nImage = 11;
item.nOpenImage = 11;
}
else
{
item.nImage = 2;
item.nOpenImage = 2;
}
}
else
{
item.nImage = 3;
item.nOpenImage = 3;
}
item.ID = (HSCOPEITEM) arg;
m_pScope->SetItem (&item);
}
break;
default:
break;
}
return hr;
}
STDMETHODIMP CRSOPComponentData::GetDisplayInfo(LPSCOPEDATAITEM pItem)
{
DWORD dwIndex;
if (pItem == NULL)
return E_POINTER;
for (dwIndex = 0; dwIndex < g_dwNameSpaceItems; dwIndex++)
{
if (g_RsopNameSpace[dwIndex].dwID == (DWORD) pItem->lParam)
break;
}
if (dwIndex == g_dwNameSpaceItems)
pItem->displayname = NULL;
else
{
if (((DWORD) pItem->lParam == 0) && m_pDisplayName)
pItem->displayname = m_pDisplayName;
else
pItem->displayname = g_RsopNameSpace[dwIndex].szDisplayName;
}
return S_OK;
}
STDMETHODIMP CRSOPComponentData::CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB)
{
HRESULT hr = S_FALSE;
LPRSOPDATAOBJECT pRSOPDataObjectA, pRSOPDataObjectB;
MMC_COOKIE cookie1, cookie2;
if (lpDataObjectA == NULL || lpDataObjectB == NULL)
return E_POINTER;
//
// QI for the private RSOPDataObject interface
//
if (FAILED(lpDataObjectA->QueryInterface(IID_IRSOPDataObject,
(LPVOID *)&pRSOPDataObjectA)))
{
return S_FALSE;
}
if (FAILED(lpDataObjectB->QueryInterface(IID_IRSOPDataObject,
(LPVOID *)&pRSOPDataObjectB)))
{
pRSOPDataObjectA->Release();
return S_FALSE;
}
pRSOPDataObjectA->GetCookie(&cookie1);
pRSOPDataObjectB->GetCookie(&cookie2);
if (cookie1 == cookie2)
{
hr = S_OK;
}
pRSOPDataObjectA->Release();
pRSOPDataObjectB->Release();
return hr;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (IExtendPropertySheet2) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CRSOPComponentData::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle, LPDATAOBJECT lpDataObject)
{
return SetupPropertyPages(RSOP_NOMSC, lpProvider, handle, lpDataObject);
}
STDMETHODIMP CRSOPComponentData::QueryPagesFor(LPDATAOBJECT lpDataObject)
{
HRESULT hr;
hr = IsSnapInManager(lpDataObject);
if (hr != S_OK)
{
hr = IsNode(lpDataObject, 0); // check for root
if (S_OK == hr)
{
return hr;
}
hr = IsNode(lpDataObject, 1); // check for machine
if (S_OK == hr)
{
return hr;
}
hr = IsNode(lpDataObject, 2); // check for user
if (S_OK == hr)
{
return hr;
}
hr = E_FAIL;
}
return hr;
}
STDMETHODIMP CRSOPComponentData::GetWatermarks(LPDATAOBJECT lpIDataObject,
HBITMAP* lphWatermark,
HBITMAP* lphHeader,
HPALETTE* lphPalette,
BOOL* pbStretch)
{
*lphPalette = NULL;
*lphHeader = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_HEADER));
*lphWatermark = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_WIZARD));;
*pbStretch = TRUE;
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (IExtendContextMenu) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CRSOPComponentData::AddMenuItems(LPDATAOBJECT piDataObject,
LPCONTEXTMENUCALLBACK pCallback,
LONG *pInsertionAllowed)
{
HRESULT hr = S_OK;
TCHAR szMenuItem[100];
TCHAR szDescription[250];
CONTEXTMENUITEM item;
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_VIEW)
{
if (IsNode(piDataObject, 0) == S_OK)
{
LoadString (g_hInstance, IDS_ARCHIVEDATA, szMenuItem, 100);
LoadString (g_hInstance, IDS_ARCHIVEDATADESC, szDescription, 250);
item.strName = szMenuItem;
item.strStatusBarText = szDescription;
item.lCommandID = IDM_ARCHIVEDATA;
item.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_VIEW;
item.fFlags = m_bArchiveData ? MFS_CHECKED : 0;
item.fSpecialFlags = 0;
hr = pCallback->AddItem(&item);
}
}
return(hr);
}
STDMETHODIMP CRSOPComponentData::Command(LONG lCommandID, LPDATAOBJECT piDataObject)
{
TCHAR szCaption[100];
TCHAR szMessage[300];
INT iRet;
if (lCommandID == IDM_ARCHIVEDATA)
{
m_bArchiveData = !m_bArchiveData;
if (m_bViewIsArchivedData && !m_bArchiveData)
{
LoadString(g_hInstance, IDS_ARCHIVEDATA_CAPTION, szCaption, ARRAYSIZE(szCaption));
LoadString(g_hInstance, IDS_ARCHIVEDATA_MESSAGE, szMessage, ARRAYSIZE(szMessage));
m_pConsole->MessageBox (szMessage, szCaption, MB_OK, &iRet);
}
SetDirty();
}
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (IPersistStreamInit) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CRSOPComponentData::GetClassID(CLSID *pClassID)
{
if (!pClassID)
{
return E_FAIL;
}
*pClassID = CLSID_RSOPSnapIn;
return S_OK;
}
STDMETHODIMP CRSOPComponentData::IsDirty(VOID)
{
return ThisIsDirty() ? S_OK : S_FALSE;
}
HRESULT CRSOPComponentData::DeleteRSOPData(LPTSTR lpNameSpace)
{
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
IWbemClassObject * pClass = NULL;
IWbemClassObject * pOutInst = NULL;
IWbemClassObject * pInClass = NULL;
IWbemClassObject * pInInst = NULL;
BSTR bstrParam = NULL;
BSTR bstrClassPath = NULL;
BSTR bstrMethodName = NULL;
VARIANT var;
TCHAR szBuffer[MAX_PATH];
LPTSTR szLocalNameSpace = NULL;
HRESULT hr;
HRESULT hrSuccess;
szLocalNameSpace = (LPTSTR)LocalAlloc(LPTR, (2+lstrlen(lpNameSpace))*sizeof(TCHAR));
if (!szLocalNameSpace) {
hr = HRESULT_FROM_WIN32(GetLastError());
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::DeleteRSOPData: LocalAlloc failed with 0x%x"), hr));
goto Cleanup;
}
if (CompareString (LOCALE_USER_DEFAULT, NORM_STOP_ON_NULL,
TEXT("\\\\"), 2, lpNameSpace, 2) == CSTR_EQUAL) {
if (CompareString (LOCALE_USER_DEFAULT, NORM_STOP_ON_NULL,
TEXT("\\\\."), 3, lpNameSpace, 3) != CSTR_EQUAL) {
LPTSTR lpEnd;
lpEnd = wcschr(lpNameSpace+2, L'\\');
if (!lpEnd) {
hr = E_FAIL;
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::DeleteRSOPData: Invalid format for name space")));
goto Cleanup;
}
else {
lstrcpy(szLocalNameSpace, TEXT("\\\\."));
lstrcat(szLocalNameSpace, lpEnd);
}
}
else {
lstrcpy(szLocalNameSpace, lpNameSpace);
}
}
else {
lstrcpy(szLocalNameSpace, lpNameSpace);
}
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::DeleteRSOPData: Namespace passed to the provider = %s"), szLocalNameSpace));
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pLocator);
if (FAILED(hr))
{
goto Cleanup;
}
if (m_bDiagnostic)
{
// set up diagnostic mode
// build a path to the target: "\\\\computer\\root\\rsop"
_stprintf(szBuffer, TEXT("\\\\%s\\root\\rsop"), NameWithoutDomain(m_szComputerName));
bstrParam = SysAllocString(szBuffer);
if (!bstrParam)
{
hr = E_FAIL;
goto Cleanup;
}
hr = pLocator->ConnectServer(bstrParam,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
goto Cleanup;
}
bstrClassPath = SysAllocString(TEXT("RsopLoggingModeProvider"));
hr = pNamespace->GetObject(bstrClassPath,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pClass,
NULL);
if (FAILED(hr))
{
goto Cleanup;
}
}
else
{
// set up planning mode
// build a path to the DC: "\\\\dc\\root\\rsop"
_stprintf(szBuffer, TEXT("\\\\%s\\root\\rsop"), m_szDC);
bstrParam = SysAllocString(szBuffer);
if (!bstrParam)
{
hr = E_FAIL;
goto Cleanup;
}
hr = pLocator->ConnectServer(bstrParam,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
goto Cleanup;
}
bstrClassPath = SysAllocString(TEXT("RsopPlanningModeProvider"));
hr = pNamespace->GetObject(bstrClassPath,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pClass,
NULL);
if (FAILED(hr))
{
goto Cleanup;
}
}
bstrMethodName = SysAllocString(TEXT("RsopDeleteSession"));
if (!bstrMethodName)
{
hr = E_FAIL;
goto Cleanup;
}
hr = pClass->GetMethod(bstrMethodName,
0,
&pInClass,
NULL);
if (FAILED(hr))
{
goto Cleanup;
}
hr = pInClass->SpawnInstance(0, &pInInst);
if (FAILED(hr))
{
goto Cleanup;
}
hr = SetParameter(pInInst, TEXT("nameSpace"), szLocalNameSpace);
if (FAILED(hr))
{
goto Cleanup;
}
// Set the proper security to prevent the ExecMethod call from failing
hr = CoSetProxyBlanket(pNamespace,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_DEFAULT,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
0);
if (FAILED(hr))
{
goto Cleanup;
}
hr = pNamespace->ExecMethod(bstrClassPath,
bstrMethodName,
0,
NULL,
pInInst,
&pOutInst,
NULL);
if (FAILED(hr))
{
goto Cleanup;
}
hr = GetParameter(pOutInst, TEXT("hResult"), hrSuccess);
if (SUCCEEDED(hr))
{
if (FAILED(hrSuccess))
{
hr = hrSuccess;
}
}
Cleanup:
if (szLocalNameSpace) {
LocalFree(szLocalNameSpace);
szLocalNameSpace = NULL;
}
SysFreeString(bstrParam);
SysFreeString(bstrClassPath);
SysFreeString(bstrMethodName);
if (pInInst)
{
pInInst->Release();
}
if (pOutInst)
{
pOutInst->Release();
}
if (pInClass)
{
pInClass->Release();
}
if (pClass)
{
pClass->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
return hr;
}
//+--------------------------------------------------------------------------
//
// Function: GenerateRSOPDataEx
//
// Synopsis: Wrapper around GenerateRSOPData. This version adds retry
// support. If the user doesn't have access to half of the data
// this method will re-issue the query for only the part of the data
// the user has access to.
//
//---------------------------------------------------------------------------
HRESULT CRSOPComponentData::GenerateRSOPDataEx(HWND hDlg, LPTSTR *lpNameSpace)
{
HRESULT hr;
ULONG ulErrorInfo;
BOOL bSkipCSEs, bLimitData, bUser, bForceCreate;
bSkipCSEs = bLimitData = bUser = bForceCreate = FALSE;
hr = GenerateRSOPData (hDlg, lpNameSpace, bSkipCSEs, bLimitData, bUser, bForceCreate, &ulErrorInfo);
if (FAILED(hr))
{
if (ulErrorInfo == RSOP_USER_ACCESS_DENIED)
{
ReportError (hDlg, hr, IDS_EXECFAILED_USER);
m_bUserDeniedAccess = TRUE;
FillResultsList (GetDlgItem (hDlg, IDC_LIST1));
bSkipCSEs = bUser = bForceCreate = FALSE;
bLimitData = TRUE;
hr = GenerateRSOPData (hDlg, lpNameSpace, bSkipCSEs, bLimitData, bUser, bForceCreate, &ulErrorInfo);
}
else if (ulErrorInfo == RSOP_COMPUTER_ACCESS_DENIED)
{
ReportError (hDlg, hr, IDS_EXECFAILED_COMPUTER);
m_bComputerDeniedAccess = TRUE;
FillResultsList (GetDlgItem (hDlg, IDC_LIST1));
bSkipCSEs = bForceCreate = FALSE;
bLimitData = bUser = TRUE;
hr = GenerateRSOPData (hDlg, lpNameSpace, bSkipCSEs, bLimitData, bUser, bForceCreate, &ulErrorInfo);
}
if (FAILED(hr)) {
if ((ulErrorInfo & RSOP_COMPUTER_ACCESS_DENIED) &&
(ulErrorInfo & RSOP_USER_ACCESS_DENIED)) {
// both are denied access
ReportError (hDlg, hr, IDS_EXECFAILED_BOTH);
}
else if (ulErrorInfo & RSOP_TEMPNAMESPACE_EXISTS) {
TCHAR szConfirm[MAX_PATH], szTitle[MAX_PATH];
szConfirm[0] = szTitle[0] = TEXT('\0');
LoadString(g_hInstance, IDS_RSOPDELNAMESPACE, szConfirm, ARRAYSIZE(szConfirm));
LoadString(g_hInstance, IDS_RSOPDELNS_TITLE, szTitle, ARRAYSIZE(szTitle));
if (MessageBox(hDlg, szConfirm, szTitle, MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2) == IDOK) {
// use the same options as before
bForceCreate = TRUE;
hr = GenerateRSOPData (hDlg, lpNameSpace, bSkipCSEs, bLimitData, bUser, bForceCreate, &ulErrorInfo);
}
}
}
if (hr == HRESULT_FROM_WIN32(WAIT_TIMEOUT)) {
ReportError (hDlg, hr, IDS_EXECFAILED_TIMEDOUT);
}
else
{
if (FAILED(hr)) {
ReportError (hDlg, hr, IDS_EXECFAILED);
}
}
}
return hr;
}
//+--------------------------------------------------------------------------
//
// Function: GenerateRSOPData
//
// Synopsis: Calls the rsop provider based on the settings made in the
// initialization wizard
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 10-04-1999 stevebl Created
//
// Notes:
//
//---------------------------------------------------------------------------
HRESULT CRSOPComponentData::GenerateRSOPData(HWND hDlg, LPTSTR *lpNameSpace,
BOOL bSkipCSEs, BOOL bLimitData,
BOOL bUser, BOOL bForceCreate,
ULONG *pulErrorInfo)
{
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
IWbemClassObject * pClass = NULL;
IWbemClassObject * pOutInst = NULL;
IWbemClassObject * pInClass = NULL;
IWbemClassObject * pInInst = NULL;
IUnsecuredApartment *pSpawner = NULL;
IUnknown *pSubstitute = NULL;
IWbemObjectSink *pSubstituteSink = NULL;
BSTR bstrParam = NULL;
BSTR bstrClassPath = NULL;
BSTR bstrMethodName = NULL;
VARIANT var;
TCHAR szBuffer[MAX_PATH];
HRESULT hr;
HRESULT hrSuccess;
CCreateSessionSink *pCSS = NULL;
MSG msg;
UINT uiFlags = 0;
BOOL bSetData;
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: CoCreateInstance failed with 0x%x"), hr));
goto Cleanup;
}
if (m_bDiagnostic)
{
// set up diagnostic mode
// build a path to the target: "\\\\computer\\root\\rsop"
_stprintf(szBuffer, TEXT("\\\\%s\\root\\rsop"), NameWithoutDomain(m_szComputerName));
bstrParam = SysAllocString(szBuffer);
hr = pLocator->ConnectServer(bstrParam,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: ConnectServer failed with 0x%x"), hr));
ReportError (hDlg, hr, IDS_CONNECTSERVERFAILED, m_szComputerName);
goto Cleanup;
}
bstrClassPath = SysAllocString(TEXT("RsopLoggingModeProvider"));
hr = pNamespace->GetObject(bstrClassPath,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pClass,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: GetObject failed with 0x%x"), hr));
goto Cleanup;
}
bstrMethodName = SysAllocString(TEXT("RsopCreateSession"));
hr = pClass->GetMethod(bstrMethodName,
0,
&pInClass,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: GetMethod failed with 0x%x"), hr));
goto Cleanup;
}
hr = pInClass->SpawnInstance(0, &pInInst);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SpawnInstance failed with 0x%x"), hr));
goto Cleanup;
}
if (m_bNoUserData || m_bUserDeniedAccess)
{
uiFlags |= FLAG_NO_USER;
}
if (m_bNoComputerData || m_bComputerDeniedAccess)
{
uiFlags |= FLAG_NO_COMPUTER;
}
if (bForceCreate) {
uiFlags |= FLAG_FORCE_CREATENAMESPACE;
}
hr = SetParameter(pInInst, TEXT("flags"), uiFlags);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (!lstrcmpi(m_szUserName, TEXT(".")))
{
hr = SetParameterToNull(pInInst, TEXT("userSid"));
}
else
{
hr = SetParameter(pInInst, TEXT("userSid"), m_szUserName);
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
}
else if ( IsPlanningModeAllowed() )
{
// set up planning mode
// build a path to the DC: "\\\\dc\\root\\rsop"
_stprintf(szBuffer, TEXT("\\\\%s\\root\\rsop"), m_szDC);
bstrParam = SysAllocString(szBuffer);
hr = pLocator->ConnectServer(bstrParam,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: ConnectServer failed with 0x%x"), hr));
ReportError (hDlg, hr, IDS_CONNECTSERVERFAILED, m_szDC);
goto Cleanup;
}
bstrClassPath = SysAllocString(TEXT("RsopPlanningModeProvider"));
hr = pNamespace->GetObject(bstrClassPath,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pClass,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: GetObject failed with 0x%x"), hr));
goto Cleanup;
}
bstrMethodName = SysAllocString(TEXT("RsopCreateSession"));
hr = pClass->GetMethod(bstrMethodName,
0,
&pInClass,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: GetMethod failed with 0x%x"), hr));
goto Cleanup;
}
hr = pInClass->SpawnInstance(0, &pInInst);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SpawnInstance failed with 0x%x"), hr));
goto Cleanup;
}
if (m_bSlowLink)
{
uiFlags |= FLAG_ASSUME_SLOW_LINK;
}
if (!bSkipCSEs || bUser)
{
switch (m_loopbackMode)
{
case LoopbackReplace:
uiFlags |= FLAG_LOOPBACK_REPLACE;
break;
case LoopbackMerge:
uiFlags |= FLAG_LOOPBACK_MERGE;
break;
default:
break;
}
}
if (bSkipCSEs)
{
uiFlags |= (FLAG_NO_GPO_FILTER | FLAG_NO_CSE_INVOKE);
}
else {
if (m_bSkipComputerWQLFilter) {
uiFlags |= FLAG_ASSUME_COMP_WQLFILTER_TRUE;
}
if (m_bSkipUserWQLFilter) {
uiFlags |= FLAG_ASSUME_USER_WQLFILTER_TRUE;
}
}
hr = SetParameter(pInInst, TEXT("flags"), uiFlags);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
//
// If this method is being called to generate temporary rsop data for the
// wmi filter UI, we only want to initialize half of the args (either user
// or computer). Decide if we want to set the computer information here.
//
bSetData = TRUE;
if (bLimitData)
{
if (bUser && (LoopbackNone == m_loopbackMode))
{
bSetData = FALSE;
}
}
if (m_szComputerName && bSetData)
{
hr = SetParameter(pInInst, TEXT("computerName"), m_szComputerName);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("computerName"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_szComputerSOM && bSetData)
{
hr = SetParameter(pInInst, TEXT("computerSOM"), m_szComputerSOM);
}
else
{
hr = SetParameterToNull (pInInst, TEXT("computerSOM"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_saComputerSecurityGroups && bSetData)
{
hr = SetParameter(pInInst, TEXT("computerSecurityGroups"), m_saComputerSecurityGroups);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("computerSecurityGroups"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_saComputerWQLFilters && bSetData)
{
hr = SetParameter(pInInst, TEXT("computerGPOFilters"), m_saComputerWQLFilters);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("computerGPOFilters"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
//
// If this method is being called to generate temporary rsop data for the
// wmi filter UI, we only want to initialize half of the args (either user
// or computer). Decide if we want to set the user information here.
//
bSetData = TRUE;
if (bLimitData)
{
if (!bUser)
{
bSetData = FALSE;
}
}
if (m_szUserName && bSetData)
{
hr = SetParameter(pInInst, TEXT("userName"), m_szUserName);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("userName"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_szUserSOM && bSetData)
{
hr = SetParameter(pInInst, TEXT("userSOM"), m_szUserSOM);
}
else
{
hr = SetParameterToNull (pInInst, TEXT("userSOM"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_saUserSecurityGroups && bSetData)
{
hr = SetParameter(pInInst, TEXT("userSecurityGroups"), m_saUserSecurityGroups);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("userSecurityGroups"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_saUserWQLFilters && bSetData)
{
hr = SetParameter(pInInst, TEXT("userGPOFilters"), m_saUserWQLFilters);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("userGPOFilters"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
if (m_szSite)
{
hr = SetParameter(pInInst, TEXT("site"), m_szSite);
}
else
{
hr = SetParameterToNull(pInInst, TEXT("site"));
}
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed with 0x%x"), hr));
goto Cleanup;
}
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: SetParameter failed because planning mode view is not implemented on non-server SKUs")));
hr = E_NOTIMPL;
goto Cleanup;
}
hr = CoCreateInstance(CLSID_UnsecuredApartment, NULL, CLSCTX_ALL,
IID_IUnsecuredApartment, (void **)&pSpawner);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: CoCreateInstance for unsecure apartment failed with 0x%x"), hr));
goto Cleanup;
}
pCSS = new CCreateSessionSink (hDlg ? GetDlgItem(hDlg, IDC_PROGRESS1) : NULL, GetCurrentThreadId());
if (!pCSS)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: Failed to create createsessionsink")));
goto Cleanup;
}
hr = pSpawner->CreateObjectStub(pCSS, &pSubstitute);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: CreateObjectStub failed with 0x%x"), hr));
goto Cleanup;
}
hr = pSubstitute->QueryInterface(IID_IWbemObjectSink, (LPVOID *)&pSubstituteSink);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: QI failed with 0x%x"), hr));
goto Cleanup;
}
// Set the proper security to prevent the ExecMethod call from failing
hr = CoSetProxyBlanket(pNamespace,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_DEFAULT,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
0);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: CoSetProxyBlanket failed with 0x%x"), hr));
goto Cleanup;
}
pCSS->SendQuitMessage (TRUE);
hr = pNamespace->ExecMethodAsync(bstrClassPath,
bstrMethodName,
WBEM_FLAG_SEND_STATUS,
NULL,
pInInst,
pSubstituteSink);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GenerateRSOPData: ExecMethodAsync failed with 0x%x"), hr));
pCSS->SendQuitMessage (FALSE);
goto Cleanup;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
pCSS->SendQuitMessage (FALSE);
pCSS->GetResult (&hrSuccess);
pCSS->GetErrorInfo (pulErrorInfo);
if (SUCCEEDED(hrSuccess))
{
LPTSTR lpComputerName;
BSTR bstrNamespace = NULL;
pCSS->GetNamespace (&bstrNamespace);
if (bstrNamespace)
{
if (m_bDiagnostic)
{
lpComputerName = NameWithoutDomain(m_szComputerName);
}
else
{
lpComputerName = m_szDC;
}
*lpNameSpace = new TCHAR[_tcslen(bstrNamespace) + _tcslen(lpComputerName) + 1];
if (*lpNameSpace)
{
lstrcpy (*lpNameSpace, TEXT("\\\\"));
lstrcat (*lpNameSpace, lpComputerName);
lstrcat (*lpNameSpace, (bstrNamespace+3));
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::GenerateRSOPData: Complete namespace is: %s"), *lpNameSpace));
}
else
{
hr = E_OUTOFMEMORY;
}
}
}
else
{
hr = hrSuccess;
if (hDlg)
{
SendMessage (GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, 0, 0);
}
goto Cleanup;
}
Cleanup:
SysFreeString(bstrParam);
SysFreeString(bstrClassPath);
SysFreeString(bstrMethodName);
if (pInInst)
{
pInInst->Release();
}
if (pOutInst)
{
pOutInst->Release();
}
if (pInClass)
{
pInClass->Release();
}
if (pClass)
{
pClass->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
if (pSubstitute)
{
pSubstitute->Release();
}
if (pSubstituteSink)
{
pSubstituteSink->Release();
}
if (pSpawner)
{
pSpawner->Release();
}
if (pCSS)
{
pCSS->Release();
}
return hr;
}
HRESULT CRSOPComponentData::SetupPropertyPages(DWORD dwFlags, LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle, LPDATAOBJECT lpDataObject)
{
HRESULT hr = E_FAIL;
PROPSHEETPAGE psp;
HPROPSHEETPAGE hPage;
TCHAR szTitle[150];
TCHAR szSubTitle[300];
BOOL bShowNow;
HPROPSHEETPAGE hShowNowPages[20];
DWORD dwCount=0, dwDiagStartPage = 0, dwPlanStartPage = 0, dwDiagFinishPage = 0, dwPlanFinishPage = 0;
hr = this->SetupFonts();
if (FAILED(hr))
return hr;
bShowNow = (!(dwFlags & RSOP_NOMSC));
if (bShowNow || (IsSnapInManager(lpDataObject) == S_OK))
{
//
// Create the wizard property sheets
//
//
// Welcome sheet and the mode are only applicable in no override mode
//
if (!bShowNow) {
// LoadString (g_hInstance, IDS_TITLE_WELCOME, szTitle, ARRAYSIZE(szTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
// psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.dwFlags = PSP_HIDEHEADER;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_WELCOME);
psp.pfnDlgProc = RSOPWelcomeDlgProc;
psp.lParam = (LPARAM) this;
//psp.pszHeaderTitle = szTitle;
psp.pszHeaderTitle = NULL;
psp.pszHeaderSubTitle = NULL;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
LoadString (g_hInstance, IDS_TITLE_CHOOSEMODE, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_CHOOSEMODE, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_CHOOSEMODE);
psp.pfnDlgProc = RSOPChooseModeDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
LoadString (g_hInstance, IDS_TITLE_GETCOMP, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_GETCOMP, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_GETCOMP);
psp.pfnDlgProc = RSOPGetCompDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwDiagStartPage = dwCount;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_GETUSER, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_GETUSER, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_GETUSER);
psp.pfnDlgProc = RSOPGetUserDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_GETTARGET, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_GETTARGET, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_GETTARGET);
psp.pfnDlgProc = RSOPGetTargetDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwPlanStartPage = dwCount;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_GETDC, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_GETDC, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_GETDC);
psp.pfnDlgProc = RSOPGetDCDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_ALTDIRS, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_ALTDIRS, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_ALTDIRS);
psp.pfnDlgProc = RSOPAltDirsDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_USERSECGRPS, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_USERSECGRPS, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_ALTUSERSEC);
psp.pfnDlgProc = RSOPAltUserSecDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_COMPSECGRPS, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_COMPSECGRPS, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_ALTCOMPSEC);
psp.pfnDlgProc = RSOPAltCompSecDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_WQLUSER, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_WQL, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_WQLUSER);
psp.pfnDlgProc = RSOPWQLUserDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_WQLCOMP, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_WQL, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_WQLCOMP);
psp.pfnDlgProc = RSOPWQLCompDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_FINISHED, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_FINISHED, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_FINISHED);
psp.pfnDlgProc = RSOPFinishedDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwDiagFinishPage = dwCount;
dwCount++;
}
LoadString (g_hInstance, IDS_TITLE_FINISHED, szTitle, ARRAYSIZE(szTitle));
LoadString (g_hInstance, IDS_SUBTITLE_FINISHED, szSubTitle, ARRAYSIZE(szSubTitle));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_FINISHED3);
psp.pfnDlgProc = RSOPFinishedDlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = szTitle;
psp.pszHeaderSubTitle = szSubTitle;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwPlanFinishPage = dwCount;
dwCount++;
}
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_HIDEHEADER;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_FINISHED2);
psp.pfnDlgProc = RSOPFinished2DlgProc;
psp.lParam = (LPARAM) this;
psp.pszHeaderTitle = NULL;
psp.pszHeaderSubTitle = NULL;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
if (!bShowNow) {
hr = lpProvider->AddPage(hPage);
if (FAILED(hr))
{
return hr;
}
}
else {
hShowNowPages[dwCount] = hPage;
dwCount++;
}
if (bShowNow) {
INT_PTR iRet;
PROPSHEETHEADER psph;
psph.dwSize = sizeof(PROPSHEETHEADER);
psph.dwFlags = PSH_WIZARD97 | PSH_HEADER | PSH_WATERMARK;
/*PSH_NOCONTEXTHELP | PSH_NOAPPLYNOW | PSH_WIZARD | PSH_WIZARD97 |
PSH_STRETCHWATERMARK | PSH_HEADER | PSH_USEHBMHEADER |*/
psph.hwndParent = NULL;
psph.hInstance = g_hInstance;
psph.nPages = dwCount;
// psph.hbmHeader = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_HEADER));
psph.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
psph.pszbmWatermark = MAKEINTRESOURCE(IDB_WIZARD);
//psph.hbmWatermark = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_WIZARD));
/*
if (!psph.hbmHeader) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: couldn't load bitmap. Error %d."), GetLastError()));
}
else {
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::CreatePropertyPages: loaded bitmap")));
}
*/
if (dwFlags & RSOPMSC_OVERRIDE) {
psph.nStartPage = m_bDiagnostic ? dwDiagStartPage : dwPlanStartPage;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::CreatePropertyPages: Showing prop sheet in override mode.")));
}
else {
psph.nStartPage = m_bDiagnostic ? dwDiagFinishPage : dwPlanFinishPage;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::CreatePropertyPages: Showing prop sheet in no override mode.")));
}
psph.phpage = hShowNowPages;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::CreatePropertyPages: Showing prop sheet.")));
iRet = PropertySheet(&psph);
if (iRet == -1) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: PropertySheet failed with error %d."),
GetLastError()));
}
// user cancelled in the wizard
if (iRet != IDOK) {
return S_FALSE;
}
else {
return S_OK;
}
}
}
else
{
BOOL fRoot, fMachine, fUser;
hr = IsNode(lpDataObject, 0); // check for root node
fRoot = (S_OK == hr);
hr = IsNode(lpDataObject, 1); // check for machine node
fMachine = (S_OK == hr);
hr = IsNode(lpDataObject, 2); // check for user
fUser = (S_OK == hr);
hr = E_FAIL;
if (fMachine || fUser)
{
//
// Create the GPO property sheet
//
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = 0;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_GPOLIST);
psp.pfnDlgProc = fMachine ? RSOPGPOListMachineProc : RSOPGPOListUserProc;
psp.lParam = (LPARAM) this;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
hr = lpProvider->AddPage(hPage);
//
// Create the Error information property sheet
//
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = 0;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_ERRORS);
psp.pfnDlgProc = fMachine ? RSOPErrorsMachineProc : RSOPErrorsUserProc;
psp.lParam = (LPARAM) this;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
hr = lpProvider->AddPage(hPage);
}
if (fRoot)
{
//
// Create the GPO property sheet
//
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = 0;
psp.hInstance = g_hInstance;
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_QUERY);
psp.pfnDlgProc = QueryDlgProc;
psp.lParam = (LPARAM) this;
hPage = CreatePropertySheetPage(&psp);
if (!hPage)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
return E_FAIL;
}
hr = lpProvider->AddPage(hPage);
}
}
return S_OK;
}
HRESULT CRSOPComponentData::InitializeRSOPFromMSC(DWORD dwFlags)
{
HRESULT hr;
hr = SetupPropertyPages(dwFlags, NULL, NULL, NULL);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOP: SetupPropertyPages failed with 0x%x"), hr));
}
if (hr == S_FALSE) {
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::InitializeRSOP: User cancelled in the init wizard")));
}
return hr;
}
HRESULT CRSOPComponentData::InitializeRSOP(HWND hDlg)
{
HRESULT hr;
hr = GenerateRSOPDataEx (hDlg, &m_szNamespace);
if (SUCCEEDED(hr))
{
m_bInitialized = TRUE;
BuildGPOLists();
BuildCSELists();
if (m_pEvents)
{
m_pEvents->DumpDebugInfo();
}
if (hDlg)
{
SetDirty();
}
BuildDisplayName();
}
else
{
m_bInitialized = FALSE;
}
return hr;
}
STDMETHODIMP CRSOPComponentData::BuildDisplayName (void)
{
TCHAR szArchiveData[100];
TCHAR szBuffer[MAX_PATH];
TCHAR szComputerName[100];
LPTSTR lpUserName, lpComputerName, lpEnd;
LPTSTR lpUserOU = NULL, lpComputerOU = NULL;
DWORD dwSize;
int n;
//
// Make the display name (needs to handle empty names)
//
if (m_bViewIsArchivedData)
{
LoadString(g_hInstance, IDS_ARCHIVEDATATAG, szArchiveData, ARRAYSIZE(szArchiveData));
}
else
{
szArchiveData[0] = TEXT('\0');
}
if (m_szUserDisplayName && !m_bNoUserData)
{
lpUserName = NameWithoutDomain(m_szUserDisplayName);
}
else if (m_szUserName && !m_bNoUserData)
{
lpUserName = NameWithoutDomain(m_szUserName);
}
else if (m_szUserSOM && !m_bNoUserData)
{
lpUserOU = GetContainerFromLDAPPath (m_szUserSOM);
lpUserName = lpUserOU;
}
else
{
lpUserName = NULL;
}
if (m_szComputerName && !m_bNoComputerData)
{
if (!lstrcmpi(m_szComputerName, TEXT(".")))
{
szComputerName[0] = TEXT('\0');
dwSize = ARRAYSIZE(szComputerName);
GetComputerNameEx (ComputerNameNetBIOS, szComputerName, &dwSize);
lpComputerName = szComputerName;
}
else
{
lstrcpyn (szComputerName, NameWithoutDomain(m_szComputerName),
ARRAYSIZE(szComputerName));
lpComputerName = szComputerName;
lpEnd = lpComputerName + lstrlen(lpComputerName) - 1;
if (*lpEnd == TEXT('$'))
{
*lpEnd = TEXT('\0');
}
}
}
else if (m_szComputerSOM && !m_bNoComputerData)
{
lpComputerOU = GetContainerFromLDAPPath (m_szComputerSOM);
lpComputerName = lpComputerOU;
}
else
{
lpComputerName = NULL;
}
if (lpUserName && lpComputerName)
{
LoadString(g_hInstance, IDS_RSOP_DISPLAYNAME1, szBuffer, ARRAYSIZE(szBuffer));
n = wcslen(szBuffer) + wcslen (szArchiveData) +
wcslen(lpUserName) + wcslen(lpComputerName) + 1;
m_pDisplayName = new WCHAR[n];
if (m_pDisplayName)
{
wsprintf(m_pDisplayName, szBuffer, lpUserName, lpComputerName);
}
}
else if (lpUserName && !lpComputerName)
{
LoadString(g_hInstance, IDS_RSOP_DISPLAYNAME2, szBuffer, ARRAYSIZE(szBuffer));
n = wcslen(szBuffer) + wcslen (szArchiveData) +
wcslen(lpUserName) + 1;
m_pDisplayName = new WCHAR[n];
if (m_pDisplayName)
{
wsprintf(m_pDisplayName, szBuffer, lpUserName);
}
}
else
{
LoadString(g_hInstance, IDS_RSOP_DISPLAYNAME2, szBuffer, ARRAYSIZE(szBuffer));
n = wcslen(szBuffer) + wcslen (szArchiveData) +
(lpComputerName ? wcslen(lpComputerName) : 0) + 1;
m_pDisplayName = new WCHAR[n];
if (m_pDisplayName)
{
wsprintf(m_pDisplayName, szBuffer, (lpComputerName ? lpComputerName : L""));
}
}
if (m_pDisplayName && m_bViewIsArchivedData)
{
lstrcat (m_pDisplayName, szArchiveData);
}
if (lpUserOU)
{
delete [] lpUserOU;
}
if (lpComputerOU)
{
delete [] lpComputerOU;
}
return S_OK;
}
STDMETHODIMP CRSOPComponentData::CopyMSCToFile (IStream *pStm, LPTSTR *lpMofFileName)
{
HRESULT hr;
LPTSTR lpFileName;
ULARGE_INTEGER FileSize, SubtractAmount;
ULONG nBytesRead;
LPBYTE lpData;
DWORD dwError, dwReadAmount, dwRead, dwBytesWritten;
HANDLE hFile;
//
// Get the filename to work with
//
lpFileName = CreateTempFile();
if (!lpFileName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: Failed to create temp filename with %d"), GetLastError()));
return HRESULT_FROM_WIN32(GetLastError());
}
//
// Read in the data length
//
hr = pStm->Read(&FileSize, sizeof(FileSize), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(FileSize)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: Failed to read data size with 0x%x."), hr));
return E_FAIL;
}
//
// Allocate a buffer to use for the transfer
//
lpData = (LPBYTE) LocalAlloc (LPTR, 4096);
if (!lpData)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: Failed to allocate memory with %d."), GetLastError()));
return HRESULT_FROM_WIN32(GetLastError());
}
//
// Open the temp file
//
hFile = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: CreateFile for %s failed with %d"), lpFileName, dwError));
LocalFree (lpData);
return HRESULT_FROM_WIN32(dwError);
}
while (FileSize.QuadPart)
{
//
// Determine how much to read
//
dwReadAmount = (FileSize.QuadPart > 4096) ? 4096 : FileSize.LowPart;
//
// Read from the msc file
//
hr = pStm->Read(lpData, dwReadAmount, &nBytesRead);
if ((hr != S_OK) || (nBytesRead != dwReadAmount))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: Read failed with 0x%x"), hr));
LocalFree (lpData);
CloseHandle (hFile);
return hr;
}
//
// Write to the temp file
//
if (!WriteFile(hFile, lpData, dwReadAmount, &dwBytesWritten, NULL))
{
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: Failed to write data with %d."), dwError));
LocalFree (lpData);
CloseHandle (hFile);
return HRESULT_FROM_WIN32(dwError);
}
if (dwBytesWritten != dwReadAmount)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyMSCToFile: Failed to write the correct amount of data.")));
LocalFree (lpData);
CloseHandle (hFile);
return HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
}
SubtractAmount.LowPart = dwReadAmount;
SubtractAmount.HighPart = 0;
FileSize.QuadPart = FileSize.QuadPart - SubtractAmount.QuadPart;
}
CloseHandle (hFile);
LocalFree (lpData);
*lpMofFileName = lpFileName;
return S_OK;
}
STDMETHODIMP CRSOPComponentData::CreateNameSpace (LPTSTR lpNameSpace, LPTSTR lpParentNameSpace)
{
IWbemLocator *pIWbemLocator;
IWbemServices *pIWbemServices;
IWbemClassObject *pIWbemClassObject = NULL, *pObject = NULL;
VARIANT var;
BSTR bstrName, bstrNameProp;
HRESULT hr;
//
// Create a locater instance
//
hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pIWbemLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: CoCreateInstance failed with 0x%x"), hr));
return hr;
}
//
// Connect to the server
//
hr = pIWbemLocator->ConnectServer(lpParentNameSpace, NULL, NULL, 0, 0, NULL, NULL, &pIWbemServices);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: ConnectServer to %s failed with 0x%x"), lpNameSpace, hr));
pIWbemLocator->Release();
return hr;
}
//
// Get the namespace class
//
bstrName = SysAllocString (TEXT("__Namespace"));
if (!bstrName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: SysAllocString failed with %d"), GetLastError()));
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
hr = pIWbemServices->GetObject( bstrName, 0, NULL, &pIWbemClassObject, NULL);
SysFreeString (bstrName);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: GetObject failed with 0x%x"), hr));
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
//
// Spawn Instance
//
hr = pIWbemClassObject->SpawnInstance(0, &pObject);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: SpawnInstance failed with 0x%x"), hr));
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
//
// Convert new namespace to a bstr
//
bstrName = SysAllocString (lpNameSpace);
if (!bstrName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: SysAllocString failed with %d"), GetLastError()));
pObject->Release();
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
//
// Set the display name
//
var.vt = VT_BSTR;
var.bstrVal = bstrName;
bstrNameProp = SysAllocString (TEXT("Name"));
if (!bstrNameProp)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: SysAllocString failed with %d"), GetLastError()));
pObject->Release();
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
hr = pObject->Put( bstrNameProp, 0, &var, 0 );
SysFreeString (bstrNameProp);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: Put failed with 0x%x"), hr));
SysFreeString (bstrName);
pObject->Release();
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
//
// Commit the instance
//
hr = pIWbemServices->PutInstance( pObject, WBEM_FLAG_CREATE_OR_UPDATE, NULL, NULL );
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CreateNameSpace: PutInstance failed with 0x%x"), hr));
}
SysFreeString (bstrName);
pObject->Release();
pIWbemServices->Release();
pIWbemLocator->Release();
return hr;
}
STDMETHODIMP CRSOPComponentData::InitializeRSOPFromArchivedData(IStream *pStm)
{
HRESULT hr;
TCHAR szNameSpace[100];
GUID guid;
LPTSTR lpEnd, lpFileName, lpTemp;
//
// Create a guid to work with
//
hr = CoCreateGuid( &guid );
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: CoCreateGuid failed with 0x%x"), hr));
return hr;
}
wsprintf( m_szArchivedDataGuid,
L"NS%08lX_%04X_%04X_%02X%02X_%02X%02X%02X%02X%02X%02X",
guid.Data1,
guid.Data2,
guid.Data3,
guid.Data4[0], guid.Data4[1],
guid.Data4[2], guid.Data4[3],
guid.Data4[4], guid.Data4[5],
guid.Data4[6], guid.Data4[7] );
lstrcpy (szNameSpace, TEXT("\\\\.\\root\\rsop"));
//
// Build the parent namespace
//
hr = CreateNameSpace (m_szArchivedDataGuid, szNameSpace);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: CreateNameSpace failed with 0x%x"), hr));
return hr;
}
lpEnd = CheckSlash (szNameSpace);
lstrcpy (lpEnd, m_szArchivedDataGuid);
//
// Build the user subnamespace
//
hr = CreateNameSpace (TEXT("User"), szNameSpace);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: CreateNameSpace failed with 0x%x"), hr));
return hr;
}
//
// Build the computer subnamespace
//
hr = CreateNameSpace (TEXT("Computer"), szNameSpace);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: CreateNameSpace failed with 0x%x"), hr));
return hr;
}
//
// Save the namespace for future use
//
m_szNamespace = new TCHAR[(lstrlen(szNameSpace) + 1)];
if (!m_szNamespace) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: Failed to allocate memory with %d"), GetLastError()));
return HRESULT_FROM_WIN32(GetLastError());
}
lstrcpy (m_szNamespace, szNameSpace);
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: Namespace name is: %s"), m_szNamespace));
//
// Make a copy of the namespace that we can manipulate (to load the data with)
//
lpTemp = new TCHAR[(lstrlen(szNameSpace) + 10)];
if (!lpTemp) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: Failed to allocate memory with %d"), GetLastError()));
return HRESULT_FROM_WIN32(GetLastError());
}
lstrcpy (lpTemp, m_szNamespace);
lpEnd = CheckSlash (lpTemp);
lstrcpy (lpEnd, TEXT("Computer"));
//
// Extract the computer data to a temp file
//
hr = CopyMSCToFile (pStm, &lpFileName);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: CopyMSCToFile failed with 0x%x"), hr));
return hr;
}
//
// Use the mof compiler to pull the data from the file and put it in the
// new namespace
//
hr = ImportRSoPData (lpTemp, lpFileName);
DeleteFile (lpFileName);
delete [] lpFileName;
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: ImportRSoPData failed with 0x%x"), hr));
return hr;
}
//
// Now extract the user data to a temp file
//
lstrcpy (lpEnd, TEXT("User"));
hr = CopyMSCToFile (pStm, &lpFileName);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: CopyMSCToFile failed with 0x%x"), hr));
return hr;
}
//
// Use the mof compiler to pull the data from the file and put it in the
// new namespace
//
hr = ImportRSoPData (lpTemp, lpFileName);
DeleteFile (lpFileName);
delete [] lpFileName;
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: ImportRSoPData failed with 0x%x"), hr));
return hr;
}
delete [] lpTemp;
//
// Pull the event log information and initialize the database
//
hr = m_pEvents->LoadEntriesFromStream(pStm);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeRSOPFromArchivedData: LoadEntriesFromStream failed with 0x%x."), hr));
return hr;
}
//
// Build the common data structures used by various property sheets
//
BuildGPOLists();
BuildCSELists();
if (m_pEvents)
{
m_pEvents->DumpDebugInfo();
}
//
// Build the display name
//
BuildDisplayName();
m_bInitialized = TRUE;
return S_OK;
}
//************************************************************************
// ParseCommandLine
//
// Purpose: Parse the command line to return the value associated with options
//
// Parameters:
// szCommandLine - Part remaining in the unparsed command lines
// szArgPrefix - Argument prefix
// szArgVal - Argument value. expected in unescaped quotes
// pbFoundArg - Whether the argument was found or not
//
//
// Return
// The remaining cmd line
//
//************************************************************************
LPTSTR ParseCommandLine(LPTSTR szCommandLine, LPTSTR szArgPrefix, LPTSTR *szArgVal, BOOL *pbFoundArg)
{
LPTSTR lpEnd = NULL;
int iTemp;
iTemp = lstrlen (szArgPrefix);
if (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE | NORM_STOP_ON_NULL,
szArgPrefix, iTemp,
szCommandLine, iTemp) == CSTR_EQUAL)
{
*pbFoundArg = TRUE;
//
// Found the switch
//
szCommandLine += iTemp + 1;
lpEnd = szCommandLine;
while (*lpEnd &&
(!( ( (*(lpEnd-1)) != TEXT('\\') ) && ( (*lpEnd) == TEXT('\"') ) ) ) ) /* look for an unesced quote */
lpEnd++;
// lpEnd is at the end or at the last quote
*szArgVal = (LPTSTR) LocalAlloc (LPTR, ((lpEnd - szCommandLine) + 1) * sizeof(TCHAR));
if (*szArgVal)
{
lstrcpyn (*szArgVal, szCommandLine, (int)((lpEnd - szCommandLine) + 1));
DebugMsg((DM_VERBOSE, TEXT("ParseCOmmandLine: Argument %s = <%s>"), szArgPrefix, *szArgVal));
}
if ((*lpEnd) == TEXT('\"'))
szCommandLine = lpEnd+1;
}
else
*pbFoundArg = FALSE;
return szCommandLine;
}
STDMETHODIMP CRSOPComponentData::Load(IStream *pStm)
{
HRESULT hr = E_FAIL;
DWORD dwVersion, dwFlags;
ULONG nBytesRead;
SAFEARRAYBOUND rgsabound[1];
LONG lIndex, lMax;
LPTSTR lpText = NULL;
BSTR bstrText;
LPTSTR lpCommandLine = NULL;
LPTSTR lpTemp, lpMode;
BOOL bFoundArg;
int iStrLen;
//
// Parameter / initialization check
//
if (!pStm)
return E_FAIL;
//
// Get the command line
//
lpCommandLine = GetCommandLine();
//
// Read in the saved data version number
//
hr = pStm->Read(&dwVersion, sizeof(dwVersion), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read version number with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Confirm that we are working with the correct version
//
if (dwVersion != RSOP_PERSIST_DATA_VERSION)
{
ReportError(m_hwndFrame, 0, IDS_INVALIDMSC);
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Wrong version number (%d)."), dwVersion));
hr = E_FAIL;
goto Exit;
}
//
// Read the flags
//
hr = pStm->Read(&dwFlags, sizeof(dwFlags), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwFlags)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read flags with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Parse the command line
//
DebugMsg((DM_VERBOSE, TEXT("CComponentData::Load: Command line switch override enabled. Command line = %s"), lpCommandLine));
lpTemp = lpCommandLine;
iStrLen = lstrlen (RSOP_CMD_LINE_START);
do
{
if (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE | NORM_STOP_ON_NULL,
RSOP_CMD_LINE_START, iStrLen,
lpTemp, iStrLen) == CSTR_EQUAL)
{
m_bOverride = TRUE;
m_dwLoadFlags = RSOPMSC_OVERRIDE;
lpTemp = ParseCommandLine(lpTemp, RSOP_MODE, &lpMode, &bFoundArg);
if (bFoundArg) {
if (lpMode && lpMode[0]) {
m_bDiagnostic = (_ttoi(lpMode) == 0);
}
else {
m_bDiagnostic = FALSE;
}
if (lpMode) {
LocalFree(lpMode);
}
m_bOverride = TRUE;
continue;
}
lpTemp = ParseCommandLine(lpTemp, RSOP_USER_OU_PREF, &m_szUserSOMPref, &bFoundArg);
if (bFoundArg) {
continue;
}
lpTemp = ParseCommandLine(lpTemp, RSOP_COMP_OU_PREF, &m_szComputerSOMPref, &bFoundArg);
if (bFoundArg) {
continue;
}
lpTemp = ParseCommandLine(lpTemp, RSOP_USER_NAME, &m_szUserNamePref, &bFoundArg);
if (bFoundArg) {
continue;
}
lpTemp = ParseCommandLine(lpTemp, RSOP_COMP_NAME, &m_szComputerNamePref, &bFoundArg);
if (bFoundArg) {
continue;
}
lpTemp = ParseCommandLine(lpTemp, RSOP_SITENAME, &m_szSitePref, &bFoundArg);
if (bFoundArg) {
continue;
}
lpTemp = ParseCommandLine(lpTemp, RSOP_DCNAME_PREF, &m_szDCPref, &bFoundArg);
if (bFoundArg) {
continue;
}
lpTemp += iStrLen;
continue;
}
lpTemp++;
} while (*lpTemp);
if (!m_bOverride) {
m_dwLoadFlags = RSOPMSC_NOOVERRIDE;
m_bOverride = FALSE;
if (dwFlags & MSC_RSOP_FLAG_DIAGNOSTIC)
{
m_bDiagnostic = TRUE;
}
if (dwFlags & MSC_RSOP_FLAG_ARCHIVEDATA)
{
m_bArchiveData = TRUE;
m_bViewIsArchivedData = TRUE;
}
if (dwFlags & MSC_RSOP_FLAG_SLOWLINK)
{
m_bSlowLink = TRUE;
}
if (dwFlags & MSC_RSOP_FLAG_LOOPBACK_REPLACE)
{
m_loopbackMode = LoopbackReplace;
}
else if (dwFlags & MSC_RSOP_FLAG_LOOPBACK_MERGE)
{
m_loopbackMode = LoopbackMerge;
}
else
{
m_loopbackMode = LoopbackNone;
}
if (dwFlags & MSC_RSOP_FLAG_NOUSER)
{
m_bNoUserData = TRUE;
}
if (dwFlags & MSC_RSOP_FLAG_NOCOMPUTER)
{
m_bNoComputerData = TRUE;
}
if (dwFlags & MSC_RSOP_FLAG_USERDENIED)
{
m_bUserDeniedAccess = TRUE;
}
if (dwFlags & MSC_RSOP_FLAG_COMPUTERDENIED)
{
m_bComputerDeniedAccess = TRUE;
}
//
// Read the computer name
//
hr = ReadString (pStm, &m_szComputerName);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the computer name with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read the computer SOM
//
hr = ReadString (pStm, &m_szComputerSOM);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the computer SOM with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the security group count
//
hr = pStm->Read(&lMax, sizeof(lMax), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read security group count with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the security groups
//
if (lMax)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lMax + 1;
m_saComputerSecurityGroups = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (m_saComputerSecurityGroups)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
hr = ReadString (pStm, &lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read security group with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(m_saComputerSecurityGroups, &lIndex, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: SafeArrayPutElement failed with 0x%x."), hr));
goto Exit;
}
}
delete [] lpText;
}
}
}
//
// Read in the WQL filter count
//
hr = pStm->Read(&lMax, sizeof(lMax), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read wql filter count with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the WQL filters
//
if (lMax)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lMax + 1;
m_saComputerWQLFilters = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (m_saComputerWQLFilters)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
hr = ReadString (pStm, &lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read wql filter with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(m_saComputerWQLFilters, &lIndex, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: SafeArrayPutElement failed with 0x%x."), hr));
goto Exit;
}
}
delete [] lpText;
}
}
}
//
// Read in the WQL filter name count
//
hr = pStm->Read(&lMax, sizeof(lMax), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read wql filter name count with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the WQL filter names
//
if (lMax)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lMax + 1;
m_saComputerWQLFilterNames = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (m_saComputerWQLFilterNames)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
hr = ReadString (pStm, &lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read wql filter with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(m_saComputerWQLFilterNames, &lIndex, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: SafeArrayPutElement failed with 0x%x."), hr));
goto Exit;
}
}
delete [] lpText;
}
}
}
//
// Read the user name
//
hr = ReadString (pStm, &m_szUserName);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the user name with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read the user display name (only used in diagnostic mode)
//
hr = ReadString (pStm, &m_szUserDisplayName);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the user display name with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
if (m_bDiagnostic && !lstrcmpi(m_szUserName, TEXT(".")) && !m_bArchiveData)
{
LPTSTR lpTemp;
lpTemp = MyGetUserName (NameSamCompatible);
if (lpTemp)
{
if (m_szUserDisplayName)
{
delete [] m_szUserDisplayName;
}
m_szUserDisplayName = new TCHAR[lstrlen(lpTemp) + 1];
if (m_szUserDisplayName)
{
lstrcpy (m_szUserDisplayName, lpTemp);
}
LocalFree (lpTemp);
}
}
//
// Read the user SOM
//
hr = ReadString (pStm, &m_szUserSOM);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the user SOM with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the security group count
//
hr = pStm->Read(&lMax, sizeof(lMax), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read security group count with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the security groups
//
if (lMax)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lMax + 1;
m_saUserSecurityGroups = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (m_saUserSecurityGroups)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
hr = ReadString (pStm, &lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read security group with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(m_saUserSecurityGroups, &lIndex, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: SafeArrayPutElement failed with 0x%x."), hr));
goto Exit;
}
}
delete [] lpText;
}
}
}
//
// Read in the WQL filter count
//
hr = pStm->Read(&lMax, sizeof(lMax), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read WQL filter count with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the WQL filters
//
if (lMax)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lMax + 1;
m_saUserWQLFilters = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (m_saUserWQLFilters)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
hr = ReadString (pStm, &lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read wql filters with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(m_saUserWQLFilters, &lIndex, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: SafeArrayPutElement failed with 0x%x."), hr));
goto Exit;
}
}
delete [] lpText;
}
}
}
//
// Read in the WQL filter name count
//
hr = pStm->Read(&lMax, sizeof(lMax), &nBytesRead);
if ((hr != S_OK) || (nBytesRead != sizeof(dwVersion)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read WQL filter name count with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read in the WQL filter names
//
if (lMax)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lMax + 1;
m_saUserWQLFilterNames = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (m_saUserWQLFilterNames)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
hr = ReadString (pStm, &lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read wql filters with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(m_saUserWQLFilterNames, &lIndex, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: SafeArrayPutElement failed with 0x%x."), hr));
goto Exit;
}
}
delete [] lpText;
}
}
}
//
// Read the site
//
hr = ReadString (pStm, &m_szSite);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the site with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
//
// Read the DC
//
hr = ReadString (pStm, &m_szDC);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Failed to read the dc with 0x%x."), hr));
hr = E_FAIL;
goto Exit;
}
}
//
// Read in the WMI data if appropriate
//
if (m_bArchiveData)
{
m_pStm = pStm;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::Load: Launching RSOP status dialog box.")));
if (DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_RSOP_STATUSMSC),
NULL, InitRsopDlgProc, (LPARAM) this ) == -1) {
m_pStm = NULL;
hr = HRESULT_FROM_WIN32(GetLastError());
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Falied to create dialog box. 0x%x"), hr));
goto Exit;
}
m_pStm = NULL;
}
else
{
//
// Initialize the snapin
//
if (m_dwLoadFlags == RSOPMSC_OVERRIDE) {
hr = InitializeRSOPFromMSC(m_dwLoadFlags);
if (hr == S_FALSE) {
// this is a hack to get mmc to not launch itself when user cancelled the wizard
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::Load: User cancelled the wizard. Exitting the process")));
TerminateProcess (GetCurrentProcess(), ERROR_CANCELLED);
}
else {
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: InitializeRSOP failed with 0x%x."), hr));
goto Exit;
}
}
}
else {
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::Load: Launching RSOP status dialog box.")));
if (DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_RSOP_STATUSMSC),
NULL, InitRsopDlgProc, (LPARAM) this ) == -1) {
hr = HRESULT_FROM_WIN32(GetLastError());
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Falied to create dialog box. 0x%x"), hr));
goto Exit;
}
}
}
Exit:
return hr;
}
INT_PTR CALLBACK CRSOPComponentData::InitRsopDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
HRESULT hr = S_OK;
TCHAR szMessage[200];
switch (message)
{
case WM_INITDIALOG:
{
pCD = (CRSOPComponentData *) lParam;
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD)
{
pCD->InitializeResultsList (GetDlgItem (hDlg, IDC_LIST1));
pCD->FillResultsList (GetDlgItem (hDlg, IDC_LIST1));
if (pCD->m_bArchiveData) {
LoadString(g_hInstance, IDS_PLEASEWAIT1, szMessage, ARRAYSIZE(szMessage));
SetWindowText(GetDlgItem(hDlg, IDC_STATIC1), szMessage);
ShowWindow(GetDlgItem(hDlg, IDC_PROGRESS1), SW_HIDE);
}
}
PostMessage(hDlg, WM_INITRSOP, 0, 0);
return TRUE;
}
case WM_INITRSOP:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD->m_bArchiveData) {
hr = pCD->InitializeRSOPFromArchivedData(pCD->m_pStm);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitRsopDlgProc: InitializeRSOPFromArchivedData failed with 0x%x."), hr));
EndDialog(hDlg, 0);
return TRUE;
}
}
else {
hr = pCD->InitializeRSOP(hDlg);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitRsopDlgProc: InitializeRSOP failed with 0x%x."), hr));
EndDialog(hDlg, 0);
return TRUE;
}
}
EndDialog(hDlg, 1);
return TRUE;
}
return FALSE;
}
STDMETHODIMP CRSOPComponentData::CopyFileToMSC (LPTSTR lpFileName, IStream *pStm)
{
ULONG nBytesWritten;
WIN32_FILE_ATTRIBUTE_DATA info;
ULARGE_INTEGER FileSize, SubtractAmount;
HANDLE hFile;
DWORD dwError, dwReadAmount, dwRead;
LPBYTE lpData;
HRESULT hr;
//
// Get the file size
//
if (!GetFileAttributesEx (lpFileName, GetFileExInfoStandard, &info))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to get file attributes with %d."), GetLastError()));
return HRESULT_FROM_WIN32(GetLastError());
}
FileSize.LowPart = info.nFileSizeLow;
FileSize.HighPart = info.nFileSizeHigh;
//
// Save the file size
//
hr = pStm->Write(&FileSize, sizeof(FileSize), &nBytesWritten);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to write string length with %d."), hr));
return hr;
}
if (nBytesWritten != sizeof(FileSize))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to write the correct amount of data.")));
return HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
}
//
// Allocate a buffer to use for the transfer
//
lpData = (LPBYTE) LocalAlloc (LPTR, 4096);
if (!lpData)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to allocate memory with %d."), GetLastError()));
return HRESULT_FROM_WIN32(GetLastError());
}
//
// Open the temp file
//
hFile = CreateFile (lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: CreateFile for %s failed with %d"), lpFileName, dwError));
LocalFree (lpData);
return HRESULT_FROM_WIN32(dwError);
}
while (FileSize.QuadPart)
{
//
// Determine how much to read
//
dwReadAmount = (FileSize.QuadPart > 4096) ? 4096 : FileSize.LowPart;
//
// Read from the temp file
//
if (!ReadFile (hFile, lpData, dwReadAmount, &dwRead, NULL))
{
dwError = GetLastError();
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: ReadFile failed with %d"), dwError));
LocalFree (lpData);
CloseHandle (hFile);
return HRESULT_FROM_WIN32(dwError);
}
//
// Make sure we read enough
//
if (dwReadAmount != dwRead)
{
dwError = ERROR_INVALID_DATA;
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to read enough data")));
LocalFree (lpData);
CloseHandle (hFile);
return HRESULT_FROM_WIN32(dwError);
}
//
// Write to the stream
//
hr = pStm->Write(lpData, dwReadAmount, &nBytesWritten);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to write data with %d."), hr));
LocalFree (lpData);
CloseHandle (hFile);
return hr;
}
if (nBytesWritten != dwReadAmount)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::CopyFileToMSC: Failed to write the correct amount of data.")));
LocalFree (lpData);
CloseHandle (hFile);
return HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
}
SubtractAmount.LowPart = dwReadAmount;
SubtractAmount.HighPart = 0;
FileSize.QuadPart = FileSize.QuadPart - SubtractAmount.QuadPart;
}
CloseHandle (hFile);
LocalFree (lpData);
return S_OK;
}
STDMETHODIMP CRSOPComponentData::Save(IStream *pStm, BOOL fClearDirty)
{
HRESULT hr = STG_E_CANTSAVE;
ULONG nBytesWritten;
DWORD dwTemp;
DWORD dwFlags;
GROUP_POLICY_OBJECT_TYPE gpoType;
LPTSTR lpPath = NULL;
LPTSTR lpTemp;
DWORD dwPathSize = 1024;
LONG lIndex, lMax;
LPTSTR lpText;
LPTSTR lpUserData = NULL, lpComputerData = NULL;
TCHAR szPath[2*MAX_PATH];
//
// Save the version number
//
dwTemp = RSOP_PERSIST_DATA_VERSION;
hr = pStm->Write(&dwTemp, sizeof(dwTemp), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write version number with %d."), hr));
goto Exit;
}
//
// Save the flags
//
dwTemp = 0;
if (m_bDiagnostic)
{
dwTemp |= MSC_RSOP_FLAG_DIAGNOSTIC;
}
if (m_bArchiveData)
{
dwTemp |= MSC_RSOP_FLAG_ARCHIVEDATA;
}
if (m_bSlowLink)
{
dwTemp |= MSC_RSOP_FLAG_SLOWLINK;
}
switch (m_loopbackMode)
{
case LoopbackReplace:
dwTemp |= MSC_RSOP_FLAG_LOOPBACK_REPLACE;
break;
case LoopbackMerge:
dwTemp |= MSC_RSOP_FLAG_LOOPBACK_MERGE;
break;
default:
break;
}
if (m_bNoUserData)
{
dwTemp |= MSC_RSOP_FLAG_NOUSER;
}
if (m_bNoComputerData)
{
dwTemp |= MSC_RSOP_FLAG_NOCOMPUTER;
}
if (m_bUserDeniedAccess)
{
dwTemp |= MSC_RSOP_FLAG_USERDENIED;
}
if (m_bComputerDeniedAccess)
{
dwTemp |= MSC_RSOP_FLAG_COMPUTERDENIED;
}
hr = pStm->Write(&dwTemp, sizeof(dwTemp), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write flags with %d."), hr));
goto Exit;
}
//
// Save the computer name
//
TCHAR szLocalComputerName[MAX_PATH+1];
ULONG ulSize;
if ( (m_bArchiveData) && (!lstrcmpi(m_szComputerName, TEXT("."))) )
{
ulSize = ARRAYSIZE(szLocalComputerName);
if (!GetComputerObjectName (NameSamCompatible, szLocalComputerName, &ulSize))
{
GetComputerNameEx (ComputerNameNetBIOS, szLocalComputerName, &ulSize);
}
}
else {
lstrcpyn(szLocalComputerName, m_szComputerName, MAX_PATH);
}
hr = SaveString (pStm, szLocalComputerName);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save computer name with %d."), hr));
goto Exit;
}
//
// Save the computer SOM
//
hr = SaveString (pStm, m_szComputerSOM);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save computer SOM with %d."), hr));
goto Exit;
}
//
// Save the computer security groups
//
lMax = 0;
if (m_saComputerSecurityGroups)
{
SafeArrayGetUBound (m_saComputerSecurityGroups, 1, &lMax);
}
hr = pStm->Write(&lMax, sizeof(lMax), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write security group count with %d."), hr));
goto Exit;
}
if (lMax)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(m_saComputerSecurityGroups, &lIndex, &lpText)))
{
hr = SaveString (pStm, lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save security group with %d."), hr));
goto Exit;
}
}
}
}
//
// Save the computer WQL filters
//
lMax = 0;
if (m_saComputerWQLFilters)
{
SafeArrayGetUBound (m_saComputerWQLFilters, 1, &lMax);
}
hr = pStm->Write(&lMax, sizeof(lMax), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write security group count with %d."), hr));
goto Exit;
}
if (lMax)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(m_saComputerWQLFilters, &lIndex, &lpText)))
{
hr = SaveString (pStm, lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save wql filter with %d."), hr));
goto Exit;
}
}
}
}
//
// Save the computer WQL filter names
//
lMax = 0;
if (m_saComputerWQLFilterNames)
{
SafeArrayGetUBound (m_saComputerWQLFilterNames, 1, &lMax);
}
hr = pStm->Write(&lMax, sizeof(lMax), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write security group count with %d."), hr));
goto Exit;
}
if (lMax)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(m_saComputerWQLFilterNames, &lIndex, &lpText)))
{
hr = SaveString (pStm, lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save wql filter with %d."), hr));
goto Exit;
}
}
}
}
//
// Save the user name/
// fyi, This is not used in diagnostic mode archive data
//
hr = SaveString (pStm, m_szUserName);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save user name with %d."), hr));
goto Exit;
}
//
// Save the user display name (only used in diagnostic mode)
//
if (m_bDiagnostic && !lstrcmpi(m_szUserName, TEXT(".")))
{
if (m_bArchiveData) {
LPTSTR lpTemp;
lpTemp = MyGetUserName (NameSamCompatible);
if (lpTemp)
{
hr = SaveString (pStm, lpTemp);
LocalFree (lpTemp);
}
}
}
else
{
hr = SaveString (pStm, m_szUserDisplayName);
}
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save user display name with %d."), hr));
goto Exit;
}
//
// Save the user SOM
//
hr = SaveString (pStm, m_szUserSOM);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save user SOM with %d."), hr));
goto Exit;
}
//
// Save the user security groups
//
lMax = 0;
if (m_saUserSecurityGroups)
{
SafeArrayGetUBound (m_saUserSecurityGroups, 1, &lMax);
}
hr = pStm->Write(&lMax, sizeof(lMax), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write security group count with %d."), hr));
goto Exit;
}
if (lMax)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(m_saUserSecurityGroups, &lIndex, &lpText)))
{
hr = SaveString (pStm, lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save security group with %d."), hr));
goto Exit;
}
}
}
}
//
// Save the user WQL filters
//
lMax = 0;
if (m_saUserWQLFilters)
{
SafeArrayGetUBound (m_saUserWQLFilters, 1, &lMax);
}
hr = pStm->Write(&lMax, sizeof(lMax), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write security group count with %d."), hr));
goto Exit;
}
if (lMax)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(m_saUserWQLFilters, &lIndex, &lpText)))
{
hr = SaveString (pStm, lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save wql filter with %d."), hr));
goto Exit;
}
}
}
}
//
// Save the user WQL filter names
//
lMax = 0;
if (m_saUserWQLFilterNames)
{
SafeArrayGetUBound (m_saUserWQLFilterNames, 1, &lMax);
}
hr = pStm->Write(&lMax, sizeof(lMax), &nBytesWritten);
if ((hr != S_OK) || (nBytesWritten != sizeof(dwTemp)))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to write security group count with %d."), hr));
goto Exit;
}
if (lMax)
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(m_saUserWQLFilterNames, &lIndex, &lpText)))
{
hr = SaveString (pStm, lpText);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save wql filter with %d."), hr));
goto Exit;
}
}
}
}
//
// Save the site
//
hr = SaveString (pStm, m_szSite);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save site with %d."), hr));
goto Exit;
}
//
// Save the DC
//
hr = SaveString (pStm, m_szDC);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: Failed to save DC with %d."), hr));
goto Exit;
}
//
// Save the WMI and event log data if appropriate
//
if (m_bArchiveData)
{
lpComputerData = CreateTempFile();
if (!lpComputerData)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: CreateTempFile failed with %d."), GetLastError()));
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit;
}
lstrcpy (szPath, m_szNamespace);
lpTemp = CheckSlash (szPath);
lstrcpy (lpTemp, COMPUTER_SECTION);
hr = ExportRSoPData (szPath, lpComputerData);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: ExportRSoPData failed with 0x%x."), hr));
goto Exit;
}
hr = CopyFileToMSC (lpComputerData, pStm);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: CopyFileToMSC failed with 0x%x."), hr));
goto Exit;
}
lpUserData = CreateTempFile();
if (!lpUserData)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: CreateTempFile failed with %d."), GetLastError()));
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit;
}
lstrcpy (lpTemp, USER_SECTION);
hr = ExportRSoPData (szPath, lpUserData);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: ExportRSoPData failed with 0x%x."), hr));
goto Exit;
}
hr = CopyFileToMSC (lpUserData, pStm);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: CopyFileToMSC failed with 0x%x."), hr));
goto Exit;
}
//
// Save the event log entries
//
hr = m_pEvents->SaveEntriesToStream(pStm);
if (hr != S_OK)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Save: SaveEntriesToStream failed with 0x%x."), hr));
goto Exit;
}
}
if (fClearDirty)
{
ClearDirty();
}
Exit:
if (lpUserData)
{
DeleteFile (lpUserData);
delete [] lpUserData;
}
if (lpComputerData)
{
DeleteFile (lpComputerData);
delete [] lpComputerData;
}
return hr;
}
STDMETHODIMP CRSOPComponentData::GetSizeMax(ULARGE_INTEGER *pcbSize)
{
return E_NOTIMPL;
}
STDMETHODIMP CRSOPComponentData::InitNew(void)
{
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (ISnapinHelp) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CRSOPComponentData::GetHelpTopic(LPOLESTR *lpCompiledHelpFile)
{
LPOLESTR lpHelpFile;
lpHelpFile = (LPOLESTR) CoTaskMemAlloc (MAX_PATH * sizeof(WCHAR));
if (!lpHelpFile)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetHelpTopic: Failed to allocate memory.")));
return E_OUTOFMEMORY;
}
ExpandEnvironmentStringsW (L"%SystemRoot%\\Help\\rsopsnp.chm",
lpHelpFile, MAX_PATH);
*lpCompiledHelpFile = lpHelpFile;
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPComponentData object implementation (Internal functions) //
// //
///////////////////////////////////////////////////////////////////////////////
HRESULT CRSOPComponentData::IsNode (LPDATAOBJECT lpDataObject, MMC_COOKIE cookie)
{
HRESULT hr = S_FALSE;
LPRSOPDATAOBJECT pRSOPDataObject;
DATA_OBJECT_TYPES type;
MMC_COOKIE testcookie;
//
// We can determine if this is a GPO DataObject by trying to
// QI for the private IGPEDataObject interface. If found,
// it belongs to us.
//
if (SUCCEEDED(lpDataObject->QueryInterface(IID_IRSOPDataObject,
(LPVOID *)&pRSOPDataObject)))
{
pRSOPDataObject->GetType(&type);
pRSOPDataObject->GetCookie(&testcookie);
if ((type == CCT_SCOPE) && (cookie == testcookie))
{
hr = S_OK;
}
pRSOPDataObject->Release();
}
return (hr);
}
HRESULT CRSOPComponentData::IsSnapInManager (LPDATAOBJECT lpDataObject)
{
HRESULT hr = S_FALSE;
LPRSOPDATAOBJECT pRSOPDataObject;
DATA_OBJECT_TYPES type;
//
// We can determine if this is a RSOP DataObject by trying to
// QI for the private IRSOPDataObject interface. If found,
// it belongs to us.
//
if (SUCCEEDED(lpDataObject->QueryInterface(IID_IRSOPDataObject,
(LPVOID *)&pRSOPDataObject)))
{
//
// This is a GPO object. Now see if is a scope pane
// data object. We only want to display the property
// sheet for the scope pane.
//
if (SUCCEEDED(pRSOPDataObject->GetType(&type)))
{
if (type == CCT_SNAPIN_MANAGER)
{
hr = S_OK;
}
}
pRSOPDataObject->Release();
}
return(hr);
}
HRESULT CRSOPComponentData::EnumerateScopePane (LPDATAOBJECT lpDataObject, HSCOPEITEM hParent)
{
SCOPEDATAITEM item;
HRESULT hr;
DWORD dwIndex, i;
if (!m_hRoot)
{
m_hRoot = hParent;
if (!m_bRefocusInit)
{
SCOPEDATAITEM item;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::EnumerateScopePane: Resetting the root node")));
m_bRefocusInit = TRUE;
ZeroMemory (&item, sizeof(SCOPEDATAITEM));
item.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE;
item.displayname = MMC_CALLBACK;
if (m_bInitialized)
{
if (m_bUserGPCoreError || m_bComputerGPCoreError)
{
item.nImage = 3;
item.nOpenImage = 3;
}
else if (m_bUserCSEError || m_bComputerCSEError ||
m_bUserDeniedAccess || m_bComputerDeniedAccess)
{
item.nImage = 11;
item.nOpenImage = 11;
}
else
{
item.nImage = 2;
item.nOpenImage = 2;
}
}
else
{
item.nImage = 3;
item.nOpenImage = 3;
}
item.ID = hParent;
m_pScope->SetItem (&item);
}
}
if (!m_bInitialized)
{
if (m_hRoot == hParent)
{
SCOPEDATAITEM item;
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::EnumerateScopePane: No GPO available. Exiting.")));
ZeroMemory (&item, sizeof(SCOPEDATAITEM));
item.mask = SDI_STR | SDI_STATE | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM | SDI_CHILDREN;
item.displayname = MMC_CALLBACK;
item.nImage = 3;
item.nOpenImage = 3;
item.nState = 0;
item.cChildren = 0;
item.lParam = g_NameSpace[0].dwID;
item.relativeID = hParent;
m_pScope->InsertItem (&item);
}
return S_OK;
}
if (m_hRoot == hParent)
{
dwIndex = 0;
}
else
{
item.mask = SDI_PARAM;
item.ID = hParent;
hr = m_pScope->GetItem (&item);
if (FAILED(hr))
return hr;
dwIndex = (DWORD)item.lParam;
}
for (i = 0; i < g_dwNameSpaceItems; i++)
{
if (g_RsopNameSpace[i].dwParent == dwIndex)
{
BOOL bAdd = TRUE;
if (g_RsopNameSpace[i].dwID == 1)
{
if (!m_szComputerName && !m_szComputerSOM)
{
bAdd = FALSE;
}
if (m_bNoComputerData)
{
bAdd = FALSE;
}
if (m_bComputerDeniedAccess)
{
bAdd = FALSE;
}
}
if (g_RsopNameSpace[i].dwID == 2)
{
if (!m_szUserName && !m_szUserSOM && LoopbackNone == m_loopbackMode)
{
bAdd = FALSE;
}
if (m_bNoUserData)
{
bAdd = FALSE;
}
if (m_bUserDeniedAccess)
{
bAdd = FALSE;
}
}
if (bAdd)
{
INT iIcon, iOpenIcon;
iIcon = g_RsopNameSpace[i].iIcon;
iOpenIcon = g_RsopNameSpace[i].iOpenIcon;
if ((i == 1) && m_bComputerGPCoreError)
{
iIcon = 12;
iOpenIcon = 12;
}
else if ((i == 1) && m_bComputerCSEError)
{
iIcon = 14;
iOpenIcon = 14;
}
else if ((i == 2) && m_bUserGPCoreError)
{
iIcon = 13;
iOpenIcon = 13;
}
else if ((i == 2) && m_bUserCSEError)
{
iIcon = 15;
iOpenIcon = 15;
}
item.mask = SDI_STR | SDI_STATE | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM | SDI_CHILDREN;
item.displayname = MMC_CALLBACK;
item.nImage = iIcon;
item.nOpenImage = iOpenIcon;
item.nState = 0;
item.cChildren = g_RsopNameSpace[i].cChildren;
item.lParam = g_RsopNameSpace[i].dwID;
item.relativeID = hParent;
if (SUCCEEDED(m_pScope->InsertItem (&item)))
{
if (i == 1)
{
m_hMachine = item.ID;
}
else if (i == 2)
{
m_hUser = item.ID;
}
}
}
}
}
return S_OK;
}
HRESULT ImplementBrowseButton(HWND hDlg, DWORD dwFlagsUp, DWORD dwFlagsDown,
DWORD dwflScope, HWND hLB, TCHAR * &sz)
{
// shell the object picker to get the computer list
HRESULT hr = E_FAIL;
IDsObjectPicker * pDsObjectPicker = NULL;
const ULONG cbNumScopes = 4; //make sure this number matches the number of scopes initialized
DSOP_SCOPE_INIT_INFO ascopes [cbNumScopes];
DSOP_INIT_INFO InitInfo;
IDataObject * pdo = NULL;
STGMEDIUM stgmedium = {
TYMED_HGLOBAL,
NULL
};
UINT cf = 0;
FORMATETC formatetc = {
(CLIPFORMAT)cf,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL
};
BOOL bAllocatedStgMedium = FALSE;
PDS_SELECTION_LIST pDsSelList = NULL;
PDS_SELECTION pDsSelection = NULL;
ULONG ulSize, ulIndex, ulMax;
LPWSTR lpTemp;
hr = CoInitialize (NULL);
if (FAILED(hr))
goto Browse_Cleanup;
hr = CoCreateInstance (CLSID_DsObjectPicker,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDsObjectPicker,
(void **) & pDsObjectPicker
);
if (FAILED(hr))
goto Browse_Cleanup;
//Initialize the scopes.
ZeroMemory (ascopes, cbNumScopes * sizeof (DSOP_SCOPE_INIT_INFO));
ascopes[0].cbSize = ascopes[1].cbSize = ascopes[2].cbSize = ascopes[3].cbSize
= sizeof (DSOP_SCOPE_INIT_INFO);
ascopes[0].flType = DSOP_SCOPE_TYPE_GLOBAL_CATALOG;
ascopes[0].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP
| DSOP_SCOPE_FLAG_STARTING_SCOPE | dwflScope;
ascopes[0].FilterFlags.Uplevel.flBothModes = dwFlagsUp;
ascopes[1].flType = DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN;
ascopes[1].FilterFlags.Uplevel.flBothModes = dwFlagsUp;
ascopes[1].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP | dwflScope;
ascopes[2].flType = DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN |
DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN;
ascopes[2].FilterFlags.Uplevel.flBothModes = dwFlagsUp;
ascopes[2].FilterFlags.flDownlevel = dwFlagsDown;
ascopes[2].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP | dwflScope;
ascopes[3].flType = DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE |
DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE |
DSOP_SCOPE_TYPE_WORKGROUP;
ascopes[3].FilterFlags.Uplevel.flBothModes = dwFlagsUp;
ascopes[3].FilterFlags.flDownlevel = dwFlagsDown;
ascopes[3].flScope = DSOP_SCOPE_FLAG_WANT_PROVIDER_LDAP | dwflScope;
//populate the InitInfo structure that will be used to initialize the
//object picker
ZeroMemory (&InitInfo, sizeof (DSOP_INIT_INFO));
InitInfo.cbSize = sizeof (DSOP_INIT_INFO);
InitInfo.cDsScopeInfos = cbNumScopes;
InitInfo.aDsScopeInfos = ascopes;
InitInfo.flOptions = (hLB ? DSOP_FLAG_MULTISELECT : 0);
hr = pDsObjectPicker->Initialize (&InitInfo);
if (FAILED(hr))
goto Browse_Cleanup;
hr = pDsObjectPicker->InvokeDialog (hDlg, &pdo);
//if the computer selection dialog cannot be invoked or if the user
//hits cancel, bail out.
if (FAILED(hr) || S_FALSE == hr)
goto Browse_Cleanup;
//if we are here, the user chose, OK, so find out what group was chosen
cf = RegisterClipboardFormat (CFSTR_DSOP_DS_SELECTION_LIST);
if (0 == cf)
goto Browse_Cleanup;
//set the clipboard format for the FORMATETC structure
formatetc.cfFormat = (CLIPFORMAT)cf;
hr = pdo->GetData (&formatetc, &stgmedium);
if (FAILED (hr))
goto Browse_Cleanup;
bAllocatedStgMedium = TRUE;
pDsSelList = (PDS_SELECTION_LIST) GlobalLock (stgmedium.hGlobal);
//
// Decide what the max number of items to process is
//
ulMax = pDsSelList->cItems;
if (!hLB && (ulMax > 1))
{
ulMax = 1;
}
//
// Loop through the items
//
for (ulIndex = 0; ulIndex < ulMax; ulIndex++)
{
pDsSelection = &(pDsSelList->aDsSelection[ulIndex]);
//
// Find the beginning of the object name after the domain name
//
lpTemp = pDsSelection->pwzADsPath + 7;
while (*lpTemp && *lpTemp != TEXT('/'))
{
lpTemp++;
}
if (!(*lpTemp))
{
hr = E_FAIL;
goto Browse_Cleanup;
}
lpTemp++;
ulSize = wcslen(lpTemp);
//
// Convert the name from full DN to sam compatible
//
sz = new WCHAR[ulSize];
if (sz)
{
if (TranslateName (lpTemp, NameFullyQualifiedDN,
NameSamCompatible, sz, &ulSize))
{
BOOL bDollarRemoved = FALSE;
if (sz[wcslen(sz)-1] == L'$')
{
bDollarRemoved = TRUE;
sz[wcslen(sz)-1] = 0;
}
if (hLB)
{
INT iIndex;
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) sz);
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) ((bDollarRemoved) ? 2: 0));
SendMessage (hLB, LB_SETCURSEL, (WPARAM) iIndex, 0);
delete [] sz;
sz = NULL;
}
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
DebugMsg((DM_WARNING, TEXT("ImplementBrowseButton: TranslateName for %s to SAM style failed with %d."),
lpTemp, GetLastError()));
delete [] sz;
goto Browse_Cleanup;
}
}
else
{
hr = E_OUTOFMEMORY;
}
}
Browse_Cleanup:
if (pDsSelList)
GlobalUnlock (pDsSelList);
if (bAllocatedStgMedium)
ReleaseStgMedium (&stgmedium);
if (pdo)
pdo->Release();
if (pDsObjectPicker)
pDsObjectPicker->Release();
return hr;
}
void GetControlText(HWND hDlg, DWORD ctrlid, TCHAR * &sz)
{
UINT n;
if (sz)
{
delete [] sz;
sz = NULL;
}
n = (UINT) SendMessage(GetDlgItem(hDlg, ctrlid),
WM_GETTEXTLENGTH, 0, 0);
if (n > 0)
{
sz = new TCHAR[n + 1];
if (sz)
{
LPTSTR lpDest, lpSrc;
GetDlgItemText(hDlg, ctrlid, sz, n + 1);
if (sz[0] == TEXT(' '))
{
//
// Remove leading blanks by shuffling the characters forward
//
lpDest = lpSrc = sz;
while ((*lpSrc == TEXT(' ')) && *lpSrc)
lpSrc++;
if (*lpSrc)
{
while (*lpSrc)
{
*lpDest = *lpSrc;
lpDest++;
lpSrc++;
}
*lpDest = TEXT('\0');
}
}
//
// Remove trailing blanks
//
lpDest = sz + lstrlen(sz) - 1;
while ((*lpDest == TEXT(' ')) && (lpDest >= sz))
lpDest--;
*(lpDest+1) = TEXT('\0');
}
}
}
INT_PTR CALLBACK CRSOPComponentData::RSOPWelcomeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
{
TCHAR szDefaultGPO[128];
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
SendMessage(GetDlgItem(hDlg, IDC_RSOP_BIG_BOLD1),
WM_SETFONT, (WPARAM)pCD->m_BigBoldFont, (LPARAM)TRUE);
/*
if (!pCD->m_hChooseBitmap)
{
pCD->m_hChooseBitmap = (HBITMAP) LoadImage (g_hInstance,
MAKEINTRESOURCE(IDB_WIZARD),
IMAGE_BITMAP, 0, 0,
LR_DEFAULTCOLOR);
}
if (pCD->m_hChooseBitmap)
{
SendDlgItemMessage (hDlg, IDC_BITMAP, STM_SETIMAGE,
IMAGE_BITMAP, (LPARAM) pCD->m_hChooseBitmap);
}
*/
}
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_NEXT);
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPChooseModeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
SendMessage(GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_CHECKED, 0);
if (IsStandaloneComputer() ||
! IsPlanningModeAllowed())
{
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_WIZNEXT:
pCD->m_bDiagnostic = TRUE;
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
// skip to the planning mode pages
pCD->m_bDiagnostic = FALSE;
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETTARGET);
return TRUE;
}
break;
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
BOOL CRSOPComponentData::TestAndValidateComputer(HWND hDlg)
{
LPTSTR lpMachineName = NULL;
BOOL bOk = TRUE;
HKEY hKeyRoot = 0, hKey = 0;
DWORD dwType, dwSize, dwValue = 1;
INT iRet;
TCHAR szMessage[200];
TCHAR szCaption[100];
LONG lResult;
if (m_szComputerName && lstrcmpi(m_szComputerName, TEXT(".")))
{
lpMachineName = new TCHAR[(lstrlen(m_szComputerName) + 3)];
if (!lpMachineName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: Failed to allocate memory with %d"), GetLastError()));
goto Exit;
}
lstrcpy (lpMachineName, TEXT("\\\\"));
if ((lstrlen (m_szComputerName) > 2) && (m_szComputerName[0] == TEXT('\\')) &&
(m_szComputerName[1] == TEXT('\\')))
{
lstrcat (lpMachineName, m_szComputerName + 2);
}
else
{
lstrcat (lpMachineName, NameWithoutDomain(m_szComputerName));
}
}
SetWaitCursor();
//
// If we are testing a remote machine, test if the machine is alive and has
// the rsop namespace
//
if (lpMachineName)
{
if (!IsComputerRSoPEnabled (lpMachineName))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: IsComputerRSoPEnabled failed on machine <%s>"), lpMachineName));
if (GetLastError() == WBEM_E_INVALID_NAMESPACE)
{
ReportError (hDlg, 0, IDS_DOWNLEVELCOMPUTER, m_szComputerName);
}
else
{
ReportError (hDlg, GetLastError(), IDS_CONNECTSERVERFAILED, m_szComputerName);
}
bOk = FALSE;
goto Exit;
}
}
//
// Check if the machine has rsop logging enabled or disabled
//
lResult = RegConnectRegistry (lpMachineName, HKEY_LOCAL_MACHINE, &hKeyRoot);
ClearWaitCursor();
if (lResult != ERROR_SUCCESS)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: Failed to connect to %s with %d"),
lpMachineName, lResult));
ReportError (hDlg, lResult, IDS_CONNECTSERVERFAILED, m_szComputerName);
bOk = FALSE;
goto Exit;
}
lResult = RegOpenKeyEx (hKeyRoot, TEXT("Software\\Policies\\Microsoft\\Windows\\System"),
0, KEY_READ, &hKey);
if (lResult == ERROR_SUCCESS)
{
dwSize = sizeof (dwValue);
lResult = RegQueryValueEx (hKey, TEXT("RsopLogging"), NULL, &dwType, (LPBYTE) &dwValue,
&dwSize);
RegCloseKey (hKey);
if (lResult == ERROR_SUCCESS)
{
RegCloseKey (hKeyRoot);
goto Exit;
}
}
lResult = RegOpenKeyEx (hKeyRoot, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: Failed to open winlogon key with %d"),
lResult));
RegCloseKey (hKeyRoot);
goto Exit;
}
dwSize = sizeof (dwValue);
RegQueryValueEx (hKey, TEXT("RsopLogging"), NULL, &dwType, (LPBYTE) &dwValue, &dwSize);
RegCloseKey (hKey);
RegCloseKey (hKeyRoot);
Exit:
if (bOk && (dwValue == 0))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: RSOP Logging is not enabled on %s"),
lpMachineName));
LoadString(g_hInstance, IDS_RSOPLOGGINGDISABLED, szMessage, ARRAYSIZE(szMessage));
LoadString(g_hInstance, IDS_RSOPLOGGINGTITLE, szCaption, ARRAYSIZE(szCaption));
iRet = MessageBox (hDlg, szMessage, szCaption, MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2);
if (iRet == IDNO)
{
bOk = FALSE;
}
}
if (lpMachineName)
{
delete [] lpMachineName;
}
return bOk;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPGetCompDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD->m_szComputerNamePref) {
if (pCD->m_szComputerName)
{
delete [] pCD->m_szComputerName;
}
pCD->m_szComputerName = new WCHAR[wcslen(pCD->m_szComputerNamePref)+1];
if (pCD->m_szComputerName)
{
wcscpy (pCD->m_szComputerName, NormalizedComputerName(pCD->m_szComputerNamePref));
if (wcslen(pCD->m_szComputerName) >= 1) {
// this is being called from dsa. A terminating '$' will be passed in
pCD->m_szComputerName[wcslen(pCD->m_szComputerName)-1] = L'\0';
}
}
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
SetDlgItemText (hDlg, IDC_EDIT1, pCD->m_szComputerName);
pCD->m_bNoComputerData = FALSE;
CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
}
else {
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
}
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_EDIT1:
if (HIWORD(wParam) == EN_CHANGE)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON1:
{
TCHAR * sz;
if (ImplementBrowseButton(hDlg, DSOP_FILTER_COMPUTERS,
DSOP_DOWNLEVEL_FILTER_COMPUTERS,
DSOP_SCOPE_FLAG_DEFAULT_FILTER_COMPUTERS,
NULL, sz) == S_OK)
{
SetDlgItemText (hDlg, IDC_EDIT1, sz);
delete [] sz;
}
}
break;
case IDC_RADIO1:
SetDlgItemText (hDlg, IDC_EDIT1, TEXT(""));
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO2:
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), TRUE);
SetFocus (GetDlgItem(hDlg, IDC_EDIT1));
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
}
}
break;
case WM_REFRESHDISPLAY:
{
UINT n;
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD->m_bOverride) {
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
}
else {
if (IsDlgButtonChecked (hDlg, IDC_RADIO2) == BST_CHECKED)
{
n = (UINT) SendMessage(GetDlgItem(hDlg, IDC_EDIT1), WM_GETTEXTLENGTH, 0, 0);
if (n > 0 )
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
else
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
else
{
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
}
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_WIZNEXT:
if (IsDlgButtonChecked (hDlg, IDC_RADIO2) == BST_CHECKED)
{
GetControlText(hDlg, IDC_EDIT1, pCD->m_szComputerName);
if ( pCD->m_szComputerName )
{
TCHAR* szNormalizedComputerName;
// We need to handle the case where the user enters a name
// prefixed by '\\'
szNormalizedComputerName = NormalizedComputerName( pCD->m_szComputerName );
// If we detect the '\\' prefix, we must remove it since this syntax
// is not recognized by the RSoP provider
if ( szNormalizedComputerName != pCD->m_szComputerName )
{
TCHAR* szNewComputerName;
szNewComputerName = new TCHAR [ lstrlen( szNormalizedComputerName ) + 1 ];
if ( szNewComputerName )
{
lstrcpy( szNewComputerName, szNormalizedComputerName );
}
delete [] pCD->m_szComputerName;
pCD->m_szComputerName = szNewComputerName;
}
}
}
else
{
if (pCD->m_szComputerName)
{
delete [] pCD->m_szComputerName;
}
pCD->m_szComputerName = new TCHAR[2];
if (pCD->m_szComputerName)
{
wcscpy (pCD->m_szComputerName, L".");
}
}
if (pCD->TestAndValidateComputer (hDlg))
{
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
if (pCD->m_szUserName)
{
delete [] pCD->m_szUserName;
pCD->m_szUserName = NULL;
}
if (pCD->m_szUserDisplayName)
{
delete [] pCD->m_szUserDisplayName;
pCD->m_szUserDisplayName = NULL;
}
}
else
{
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
}
if (IsDlgButtonChecked (hDlg, IDC_CHECK1) == BST_CHECKED)
{
pCD->m_bNoComputerData = TRUE;
}
else
{
pCD->m_bNoComputerData = FALSE;
}
return TRUE;
case PSN_SETACTIVE:
if (pCD->m_bOverride) {
// This is the start page if rsop.msc is launched with
// cmd line arg for logging mode
PropSheet_SetWizButtons (GetParent(hDlg), PSWIZB_NEXT);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
HRESULT CRSOPComponentData::FillUserList (HWND hList, BOOL *bFoundCurrentUser)
{
HRESULT hr, hrSuccess;
IWbemServices * pNamespace = NULL;
IWbemClassObject * pOutInst = NULL;
BSTR bstrParam = NULL;
BSTR bstrClassPath = NULL;
BSTR bstrMethodName = NULL;
VARIANT var;
TCHAR szBuffer[MAX_PATH];
IWbemLocator * pLocator = NULL;
SAFEARRAY * psa;
LONG lMax, lIndex;
BSTR bstrSid;
PSID pSid;
TCHAR szName[125];
TCHAR szDomain[125];
TCHAR szFullName[MAX_PATH];
DWORD dwNameSize, dwDomainSize;
SID_NAME_USE NameUse;
LPTSTR lpData, szUserSidPref = NULL;
INT iRet;
LVITEM item;
LPTSTR lpCurrentUserSid = NULL;
HANDLE hToken;
LPTSTR lpSystemName = NULL;
BOOL bFoundUserPref = FALSE;
if (m_szUserNamePref) {
// Just show the user alone
*bFoundCurrentUser = FALSE;
szUserSidPref = MyLookupAccountName(
(lstrcmpi(m_szComputerName, TEXT(".")) == 0) ? NULL : NameWithoutDomain(m_szComputerName),
m_szUserNamePref);
if (!szUserSidPref) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: MyLookupAccountName failed with %d"), GetLastError()));
hr = HRESULT_FROM_WIN32(GetLastError());
}
}
if (lstrcmpi(m_szComputerName, TEXT(".")))
{
lpSystemName = m_szComputerName;
}
*bFoundCurrentUser = FALSE;
if (OpenProcessToken (GetCurrentProcess(), TOKEN_READ, &hToken))
{
lpCurrentUserSid = GetSidString(hToken);
CloseHandle (hToken);
}
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: CoCreateInstance failed with 0x%x"), hr));
goto Cleanup;
}
// set up diagnostic mode
// build a path to the target: "\\\\computer\\root\\rsop"
_stprintf(szBuffer, TEXT("\\\\%s\\root\\rsop"), NameWithoutDomain(m_szComputerName));
bstrParam = SysAllocString(szBuffer);
hr = pLocator->ConnectServer(bstrParam,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: ConnectServer to %s failed with 0x%x"), szBuffer, hr));
goto Cleanup;
}
// Set the proper security to prevent the ExecMethod call from failing
hr = CoSetProxyBlanket(pNamespace,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_DEFAULT,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
0);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: CoSetProxyBlanket failed with 0x%x"), hr));
goto Cleanup;
}
bstrClassPath = SysAllocString(TEXT("RsopLoggingModeProvider"));
bstrMethodName = SysAllocString(TEXT("RsopEnumerateUsers"));
hr = pNamespace->ExecMethod(bstrClassPath,
bstrMethodName,
0,
NULL,
NULL,
&pOutInst,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: ExecMethod failed with 0x%x"), hr));
goto Cleanup;
}
hr = GetParameter(pOutInst, TEXT("hResult"), hrSuccess);
if (SUCCEEDED(hr) && SUCCEEDED(hrSuccess))
{
VariantInit(&var);
hr = pOutInst->Get(TEXT("userSids"), 0, &var, 0, 0);
if (SUCCEEDED(hr))
{
if (var.vt & VT_ARRAY)
{
psa = var.parray;
if (SUCCEEDED( SafeArrayGetUBound(psa, 1, &lMax)))
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement (psa, &lIndex, &bstrSid)))
{
lpData = new WCHAR[(lstrlen(bstrSid) + 1)];
if (lpData)
{
lstrcpy (lpData, bstrSid);
if (lpCurrentUserSid)
{
if (!lstrcmpi(lpCurrentUserSid, lpData))
{
*bFoundCurrentUser = TRUE;
}
}
if (NT_SUCCESS(AllocateAndInitSidFromString (bstrSid, &pSid)))
{
dwNameSize = ARRAYSIZE(szName);
dwDomainSize = ARRAYSIZE(szDomain);
if (LookupAccountSid (NameWithoutDomain(lpSystemName), pSid, szName, &dwNameSize,
szDomain, &dwDomainSize, &NameUse))
{
BOOL bAddUser;
bAddUser = (!m_szUserNamePref || (lstrcmpi(szUserSidPref, lpData) == 0));
if ((m_szUserNamePref) && (lstrcmpi(szUserSidPref, lpData) == 0))
bFoundUserPref = TRUE;
if (bAddUser) {
wsprintf (szFullName, TEXT("%s\\%s"), szDomain, szName);
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_TEXT | LVIF_PARAM;
item.pszText = szFullName;
item.lParam = (LPARAM) lpData;
iRet = (int) SendMessage (hList, LVM_INSERTITEM, 0, (LPARAM) &item);
if (iRet == -1)
{
delete [] lpData;
}
}
}
else
{
delete [] lpData;
}
RtlFreeSid(pSid);
}
else
{
delete [] lpData;
}
}
}
}
}
}
}
VariantClear(&var);
item.mask = LVIF_STATE;
item.iItem = 0;
item.iSubItem = 0;
item.state = LVIS_SELECTED | LVIS_FOCUSED;
item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
SendMessage (hList, LVM_SETITEMSTATE, 0, (LPARAM) &item);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: Either GetParameter or the return value failed. hr = 0x%x, hrSuccess = 0x%x"), hr, hrSuccess));
}
if ((m_szUserNamePref) && (!bFoundUserPref)) {
hr = HRESULT_FROM_WIN32(ERROR_NO_SUCH_USER);
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: User not found on the machine")));
}
Cleanup:
SysFreeString(bstrParam);
SysFreeString(bstrClassPath);
SysFreeString(bstrMethodName);
if (pOutInst)
{
pOutInst->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
if (lpCurrentUserSid)
{
DeleteSidString(lpCurrentUserSid);
}
return hr;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPGetUserDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
{
LVCOLUMN lvcol;
RECT rect;
HWND hLV = GetDlgItem(hDlg, IDC_LIST1);
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
GetClientRect(hLV, &rect);
ZeroMemory(&lvcol, sizeof(lvcol));
lvcol.mask = LVCF_FMT | LVCF_WIDTH;
lvcol.fmt = LVCFMT_LEFT;
lvcol.cx = rect.right - GetSystemMetrics(SM_CYHSCROLL);
ListView_InsertColumn(hLV, 0, &lvcol);
SendMessage(hLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_WIZNEXT:
{
LPTSTR lpData;
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
INT iSel;
if (pCD->m_szUserName)
{
delete [] pCD->m_szUserName;
pCD->m_szUserName = NULL;
}
if (pCD->m_szUserDisplayName)
{
delete [] pCD->m_szUserDisplayName;
pCD->m_szUserDisplayName = NULL;
}
// if (IsDlgButtonChecked (hDlg, IDC_CHECK1) == BST_CHECKED)
if (IsDlgButtonChecked (hDlg, IDC_RADIO4) == BST_CHECKED)
{
pCD->m_bNoUserData = TRUE;
}
else
{
pCD->m_bNoUserData = FALSE;
if (IsDlgButtonChecked (hDlg, IDC_RADIO1))
{
LPTSTR lpTemp;
if (IsStandaloneComputer())
{
lpTemp = MyGetUserName (NameUnknown);
}
else
{
lpTemp = MyGetUserName (NameSamCompatible);
}
if (lpTemp)
{
pCD->m_szUserDisplayName = new TCHAR[lstrlen(lpTemp) + 1];
if (pCD->m_szUserDisplayName)
{
lstrcpy (pCD->m_szUserDisplayName, lpTemp);
}
LocalFree (lpTemp);
}
pCD->m_szUserName = new TCHAR[2];
if (pCD->m_szUserName)
{
lstrcpy (pCD->m_szUserName, TEXT("."));
}
}
else
{
iSel = (INT) SendMessage(hList, LVM_GETNEXTITEM, (WPARAM) -1, MAKELPARAM(LVNI_SELECTED, 0));
if (iSel != -1)
{
pCD->m_szUserDisplayName = new TCHAR[200];
if (pCD->m_szUserDisplayName)
{
LVITEM item;
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = iSel;
item.pszText = pCD->m_szUserDisplayName;
item.cchTextMax = 200;
if (SendMessage(hList, LVM_GETITEM, 0, (LPARAM) &item))
{
lpData = (LPTSTR) item.lParam;
if (lpData)
{
pCD->m_szUserName = new TCHAR[(lstrlen(lpData) + 1)];
if (pCD->m_szUserName)
{
lstrcpy (pCD->m_szUserName, lpData);
}
}
}
}
}
} // if (IsDlgButtonChecked (hDlg, IDC_RADIO1))
}
// skip to the last page in the wizard
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED);
}
return TRUE;
case PSN_SETACTIVE:
{
HRESULT hr;
BOOL bCurrentUserFound;
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
SendMessage(hList, LVM_DELETEALLITEMS, 0 ,0);
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
hr = pCD->FillUserList (hList, &bCurrentUserFound);
if (SUCCEEDED(hr))
{
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), TRUE);
if (!ListView_GetItemCount (hList))
{
// CheckDlgButton (hDlg, IDC_CHECK1, BST_CHECKED);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
}
}
else
{
ReportError (hDlg, hr, IDS_ENUMUSERSFAILED);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
}
if (!(pCD->m_szUserNamePref)) {
if ((!lstrcmpi(pCD->m_szComputerName, TEXT("."))) && bCurrentUserFound)
{
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
}
if (pCD->m_szUserName)
{
if (!lstrcmpi(pCD->m_szUserName, TEXT(".")))
{
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
}
else
{
LVFINDINFO FindInfo;
LVITEM item;
INT iRet;
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
ZeroMemory (&FindInfo, sizeof(FindInfo));
FindInfo.flags = LVFI_STRING;
FindInfo.psz = pCD->m_szUserDisplayName;
iRet = (INT) SendMessage (hList, LVM_FINDITEM,
(WPARAM) -1, (LPARAM) &FindInfo);
if (iRet != -1)
{
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_STATE;
item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
SendMessage (hList, LVM_SETITEMSTATE, (WPARAM) -1, (LPARAM) &item);
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_STATE;
item.iItem = iRet;
item.state = LVIS_SELECTED | LVIS_FOCUSED;
item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
SendMessage (hList, LVM_SETITEMSTATE, (WPARAM) iRet, (LPARAM) &item);
}
}
}
else
{
if ((!lstrcmpi(pCD->m_szComputerName, TEXT("."))) && bCurrentUserFound)
{
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
}
else
{
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
}
}
if (pCD->m_bNoComputerData)
{
pCD->m_bNoUserData = FALSE;
// CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
// EnableWindow (GetDlgItem(hDlg, IDC_CHECK1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), TRUE);
}
}
else {
// disable current user radio button
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
// disable no user data chk box
pCD->m_bNoUserData = FALSE;
// CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
// EnableWindow (GetDlgItem(hDlg, IDC_CHECK1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
case LVN_DELETEITEM:
{
NMLISTVIEW * pNMListView = (NMLISTVIEW *) lParam;
if (pNMListView && pNMListView->lParam)
{
delete [] ((LPTSTR)pNMListView->lParam);
}
}
break;
}
break;
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_RADIO1:
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO2:
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO3:
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO4:
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
}
}
break;
case WM_REFRESHDISPLAY:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
if (IsDlgButtonChecked (hDlg, IDC_RADIO4) == BST_CHECKED) {
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), FALSE);
} else {
if (IsWindowEnabled (GetDlgItem(hDlg, IDC_RADIO1)) ||
IsWindowEnabled (GetDlgItem(hDlg, IDC_RADIO2)))
{
if (pCD->m_bNoComputerData)
{
pCD->m_bNoUserData = FALSE;
// CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
// EnableWindow (GetDlgItem(hDlg, IDC_CHECK1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
}
else
{
// EnableWindow (GetDlgItem(hDlg, IDC_CHECK1), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), TRUE);
}
if (IsDlgButtonChecked (hDlg, IDC_RADIO2) == BST_CHECKED)
{
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), TRUE);
if ((INT) SendMessage(GetDlgItem(hDlg, IDC_LIST1), LVM_GETITEMCOUNT, 0, 0))
{
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
SetFocus (GetDlgItem(hDlg, IDC_LIST1));
}
else
{
// if (IsDlgButtonChecked (hDlg, IDC_CHECK1) == BST_CHECKED)
if (IsDlgButtonChecked (hDlg, IDC_RADIO4) == BST_CHECKED)
{
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
}
else
{
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
}
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), FALSE);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
}
}
else
{
if (pCD->m_bNoComputerData)
{
//
// if the user said no computer data but
// he has access to no users, enable on back button and
// disable the checkbox
//
pCD->m_bNoUserData = FALSE;
// CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
// EnableWindow (GetDlgItem(hDlg, IDC_CHECK1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
else
{
//
// This is an error condition where ::FillUserList failed
//
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), FALSE);
// CheckDlgButton (hDlg, IDC_CHECK1, BST_CHECKED);
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
// EnableWindow(GetDlgItem(hDlg, IDC_CHECK1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), FALSE);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
}
}
}
break;
}
return FALSE;
}
WCHAR * ExtractDomain(WCHAR * sz)
{
// parse through the string looking for a forward slash
DWORD cch = 0;
if (!sz)
{
return NULL;
}
while (sz[cch])
{
if (L'\\' == sz[cch] || L'/' == sz[cch])
{
WCHAR * szNew = new WCHAR[cch+1];
if (szNew)
{
wcsncpy(szNew, sz, cch);
szNew[cch] = TEXT('\0');
}
return szNew;
}
cch++;
}
// didn't find a forward slash
return NULL;
}
LPTSTR CRSOPComponentData::GetDefaultSOM (LPTSTR lpDNName)
{
HRESULT hr;
LPTSTR lpPath = NULL;
IADsPathname * pADsPathname = NULL;
BSTR bstrContainer = NULL;
//
// Create a pathname object we can work with
//
hr = CoCreateInstance(CLSID_Pathname, NULL, CLSCTX_INPROC_SERVER,
IID_IADsPathname, (LPVOID*)&pADsPathname);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildAltDirPath: Failed to create adspathname instance with 0x%x"), hr));
goto Exit;
}
//
// Add the DN name
//
hr = pADsPathname->Set (lpDNName, ADS_SETTYPE_DN);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildAltDirPath: Failed to set pathname with 0x%x"), hr));
goto Exit;
}
//
// Remove the user / computer name
//
hr = pADsPathname->RemoveLeafElement ();
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildAltDirPath: Failed to retreive GPO name with 0x%x"), hr));
goto Exit;
}
//
// Get the new path
//
hr = pADsPathname->Retrieve (ADS_FORMAT_X500_DN, &bstrContainer);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CGroupPolicyObject::New: Failed to retreive container path with 0x%x"), hr));
goto Exit;
}
//
// Allocate a new buffer for the path
//
lpPath = new TCHAR [(lstrlen(bstrContainer)+ 1)];
if (!lpPath)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildAltDirPath: Failed to allocate memory with %d"), GetLastError()));
goto Exit;
}
//
// Build the path
//
lstrcpy (lpPath, bstrContainer);
Exit:
if (bstrContainer)
{
SysFreeString (bstrContainer);
}
if (pADsPathname)
{
pADsPathname->Release();
}
return lpPath;
}
LPTSTR CRSOPComponentData::GetDomainFromSOM (LPTSTR lpSOM)
{
LPTSTR lpFullName, lpResult;
LPOLESTR lpLdapDomain, lpDomainName;
HRESULT hr;
lpFullName = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpSOM) + 10) * sizeof(TCHAR));
if (!lpFullName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetDomainFromSOM: Failed to allocate memory with %d."), GetLastError()));
return NULL;
}
lstrcpy (lpFullName, TEXT("LDAP://"));
lstrcat (lpFullName, lpSOM);
lpLdapDomain = GetDomainFromLDAPPath(lpFullName);
LocalFree (lpFullName);
if (!lpLdapDomain)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetDomainFromSOM: Failed to get ldap domain name from path.")));
return NULL;
}
hr = ConvertToDotStyle (lpLdapDomain, &lpDomainName);
delete [] lpLdapDomain;
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetDomainFromSOM: Failed to convert to dot style.")));
return NULL;
}
lpResult = new TCHAR[lstrlen(lpDomainName) + 1];
if (lpResult)
{
lstrcpy (lpResult, lpDomainName);
}
LocalFree (lpDomainName);
return lpResult;
}
VOID CRSOPComponentData::EscapeString (LPTSTR *lpString)
{
IADsPathname * pADsPathnameDest = NULL;
IADsPathname * pADsPathnameSrc = NULL;
HRESULT hr;
BSTR bstr = NULL, bstrResult;
LPTSTR lpTemp;
LONG lIndex, lCount;
//
// Create a pathname object to put the source string into so we
// can take it apart one element at a time.
//
hr = CoCreateInstance(CLSID_Pathname, NULL, CLSCTX_INPROC_SERVER,
IID_IADsPathname, (LPVOID*)&pADsPathnameSrc);
if (FAILED(hr))
{
goto Exit;
}
hr = pADsPathnameSrc->put_EscapedMode (ADS_ESCAPEDMODE_OFF_EX);
if (FAILED(hr))
{
goto Exit;
}
//
// Set the provider to LDAP and set the source string
//
hr = pADsPathnameSrc->Set (TEXT("LDAP"), ADS_SETTYPE_PROVIDER);
if (FAILED(hr))
{
goto Exit;
}
hr = pADsPathnameSrc->Set (*lpString, ADS_SETTYPE_DN);
if (FAILED(hr))
{
goto Exit;
}
//
// Query for the number of elements
//
hr = pADsPathnameSrc->GetNumElements (&lCount);
if (FAILED(hr))
{
goto Exit;
}
//
// Create a pathname object to put the freshly escaped string into
//
hr = CoCreateInstance(CLSID_Pathname, NULL, CLSCTX_INPROC_SERVER,
IID_IADsPathname, (LPVOID*)&pADsPathnameDest);
if (FAILED(hr))
{
goto Exit;
}
hr = pADsPathnameDest->put_EscapedMode(ADS_ESCAPEDMODE_ON );
if (FAILED(hr))
{
goto Exit;
}
//
// Loop through the string one element at at time escaping the RDN
//
for (lIndex = lCount; lIndex > 0; lIndex--)
{
//
// Get this element
//
hr = pADsPathnameSrc->GetElement ((lIndex - 1), &bstr);
if (FAILED(hr))
{
goto Exit;
}
//
// Check for escape characters
//
hr = pADsPathnameDest->GetEscapedElement (0, bstr, &bstrResult);
if (FAILED(hr))
{
goto Exit;
}
//
// Add the new element to the destination pathname object
//
hr = pADsPathnameDest->AddLeafElement (bstrResult);
SysFreeString (bstrResult);
if (FAILED(hr))
{
goto Exit;
}
SysFreeString (bstr);
bstr = NULL;
}
//
// Get the final path
//
hr = pADsPathnameDest->Retrieve (ADS_FORMAT_X500_DN, &bstr);
if (FAILED(hr))
{
goto Exit;
}
//
// Allocate a new buffer to hold the string
//
lpTemp = new TCHAR [lstrlen(bstr) + 1];
if (lpTemp)
{
lstrcpy (lpTemp, bstr);
delete [] *lpString;
*lpString = lpTemp;
}
Exit:
if (bstr)
{
SysFreeString (bstr);
}
if (pADsPathnameDest)
{
pADsPathnameDest->Release();
}
if (pADsPathnameSrc)
{
pADsPathnameSrc->Release();
}
}
INT CALLBACK CRSOPComponentData::DsBrowseCallback (HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == DSBM_HELP)
{
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aBrowseForOUHelpIds);
}
else if (uMsg == DSBM_CONTEXTMENU)
{
WinHelp((HWND) lParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aBrowseForOUHelpIds);
}
return 0;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPGetTargetDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
{
LPTSTR lpText, lpPath;
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD)
{
lpText = MyGetUserName(NameSamCompatible);
if (lpText)
{
SetDlgItemText (hDlg, IDC_EDIT6, lpText);
LocalFree (lpText);
}
lpText = MyGetUserName(NameFullyQualifiedDN);
if (lpText)
{
lpPath = pCD->GetDefaultSOM(lpText);
if (lpPath)
{
SetDlgItemText (hDlg, IDC_EDIT5, lpPath);
delete [] lpPath;
}
LocalFree (lpText);
}
}
if (pCD->m_szUserNamePref) {
CheckDlgButton (hDlg, IDC_RADIO2, BST_CHECKED);
SetDlgItemText(hDlg, IDC_EDIT2, pCD->m_szUserNamePref);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_RADIO1), FALSE);
}
else if (pCD->m_szUserSOMPref) {
CheckDlgButton (hDlg, IDC_RADIO1, BST_CHECKED);
SetDlgItemText(hDlg, IDC_EDIT1, pCD->m_szUserSOMPref);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
}
else {
CheckDlgButton (hDlg, IDC_RADIO1, BST_CHECKED);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
}
if (pCD->m_szComputerNamePref) {
LPTSTR szCompName;
szCompName = new WCHAR[wcslen(pCD->m_szComputerNamePref)+1];
if (szCompName)
{
wcscpy (szCompName, pCD->m_szComputerNamePref);
if (wcslen(szCompName) >= 1) {
// this is being called from dsa. A terminating '$' will be passed in
szCompName[wcslen(szCompName)-1] = L'\0';
}
CheckDlgButton (hDlg, IDC_RADIO4, BST_CHECKED);
SetDlgItemText(hDlg, IDC_EDIT4, szCompName);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_RADIO3), FALSE);
}
}
else if (pCD->m_szComputerSOMPref) {
CheckDlgButton (hDlg, IDC_RADIO3, BST_CHECKED);
SetDlgItemText(hDlg, IDC_EDIT3, pCD->m_szComputerSOMPref);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
}
else {
CheckDlgButton (hDlg, IDC_RADIO3, BST_CHECKED);
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
}
}
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_RADIO1:
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), TRUE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), TRUE);
SetDlgItemText (hDlg, IDC_EDIT2, TEXT(""));
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO2:
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), TRUE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), TRUE);
SetDlgItemText (hDlg, IDC_EDIT1, TEXT(""));
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO3:
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), TRUE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE3), TRUE);
SetDlgItemText (hDlg, IDC_EDIT4, TEXT(""));
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_RADIO4:
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), TRUE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), TRUE);
SetDlgItemText (hDlg, IDC_EDIT3, TEXT(""));
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), FALSE);
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE3), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case IDC_EDIT1:
case IDC_EDIT2:
case IDC_EDIT3:
case IDC_EDIT4:
if (HIWORD(wParam) == EN_CHANGE)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BROWSE1:
{
DSBROWSEINFO dsbi = {0};
TCHAR *szResult;
TCHAR szTitle[256];
TCHAR szCaption[256];
dsbi.hwndOwner = hDlg;
dsbi.pszCaption = szTitle;
dsbi.pszTitle = szCaption;
dsbi.cbStruct = sizeof(dsbi);
dsbi.dwFlags = DSBI_ENTIREDIRECTORY;
dsbi.pfnCallback = DsBrowseCallback;
szResult = (LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR)*4000);
if (szResult) {
dsbi.pszPath = szResult;
dsbi.cchPath = 4000;
LoadString(g_hInstance,
IDS_BROWSE_USER_OU_TITLE,
szTitle,
ARRAYSIZE(szTitle));
LoadString(g_hInstance,
IDS_BROWSE_USER_OU_CAPTION,
szCaption,
ARRAYSIZE(szCaption));
if (IDOK == DsBrowseForContainer(&dsbi))
{
SetDlgItemText(hDlg, IDC_EDIT1, (szResult+7));
}
LocalFree(szResult);
}
}
break;
case IDC_BROWSE2:
{
TCHAR * sz;
if (ImplementBrowseButton(hDlg, DSOP_FILTER_USERS,
DSOP_DOWNLEVEL_FILTER_USERS,
DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS,
NULL, sz) == S_OK)
{
SetDlgItemText (hDlg, IDC_EDIT2, sz);
delete [] sz;
}
}
break;
case IDC_BROWSE3:
{
DSBROWSEINFO dsbi = {0};
TCHAR *szResult;
TCHAR szTitle[256];
TCHAR szCaption[256];
dsbi.hwndOwner = hDlg;
dsbi.pszCaption = szTitle;
dsbi.pszTitle = szCaption;
dsbi.cbStruct = sizeof(dsbi);
dsbi.dwFlags = DSBI_ENTIREDIRECTORY;
dsbi.pfnCallback = DsBrowseCallback;
szResult = (LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR)*4000);
if (szResult) {
dsbi.pszPath = szResult;
dsbi.cchPath = 4000;
LoadString(g_hInstance,
IDS_BROWSE_COMPUTER_OU_TITLE,
szTitle,
ARRAYSIZE(szTitle));
LoadString(g_hInstance,
IDS_BROWSE_COMPUTER_OU_CAPTION,
szCaption,
ARRAYSIZE(szCaption));
if (IDOK == DsBrowseForContainer(&dsbi))
{
SetDlgItemText(hDlg, IDC_EDIT3, (szResult+7));
}
LocalFree(szResult);
}
}
break;
case IDC_BROWSE4:
{
TCHAR * sz;
if (ImplementBrowseButton(hDlg, DSOP_FILTER_COMPUTERS,
DSOP_DOWNLEVEL_FILTER_COMPUTERS,
DSOP_SCOPE_FLAG_DEFAULT_FILTER_COMPUTERS,
NULL, sz) == S_OK)
{
SetDlgItemText (hDlg, IDC_EDIT4, sz);
delete [] sz;
}
}
break;
}
}
break;
case WM_REFRESHDISPLAY:
{
UINT n;
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
n = (UINT) SendMessage(GetDlgItem(hDlg, IDC_EDIT1), WM_GETTEXTLENGTH, 0, 0);
if (n == 0)
{
n = (UINT) SendMessage(GetDlgItem(hDlg, IDC_EDIT2), WM_GETTEXTLENGTH, 0, 0);
}
if (n == 0)
{
n = (UINT) SendMessage(GetDlgItem(hDlg, IDC_EDIT3), WM_GETTEXTLENGTH, 0, 0);
}
if (n == 0)
{
n = (UINT) SendMessage(GetDlgItem(hDlg, IDC_EDIT4), WM_GETTEXTLENGTH, 0, 0);
}
if (pCD->m_bOverride) {
// This is the start page if rsop.msc is launched with
// cmd line arg for planning mode
if (n > 0 )
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
else
PropSheet_SetWizButtons(GetParent(hDlg), 0);
}
else {
if (n > 0 )
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
else
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_WIZBACK:
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_CHOOSEMODE);
return TRUE;
case PSN_SETACTIVE:
if (pCD->m_bOverride) {
// This is the start page if rsop.msc is launched with
// cmd line arg for planning mode
PropSheet_SetWizButtons (GetParent(hDlg), PSWIZB_NEXT);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case PSN_WIZNEXT:
{
HRESULT hr;
IDirectoryObject * pUserObject = NULL;
IDirectoryObject * pComputerObject = NULL;
LPTSTR lpUserName = NULL, lpUserSOM = NULL;
LPTSTR lpComputerName = NULL, lpComputerSOM = NULL;
LPTSTR lpFullName;
SetWaitCursor();
//
// Get the user and dn name
//
if (IsDlgButtonChecked(hDlg, IDC_RADIO1) == BST_CHECKED)
{
GetControlText(hDlg, IDC_EDIT1, lpUserSOM);
if (lpUserSOM)
{
pCD->EscapeString (&lpUserSOM);
hr = pCD->TestSOM (lpUserSOM, hDlg);
if (FAILED(hr))
{
if (hr != E_INVALIDARG)
{
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
}
delete [] lpUserSOM;
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
}
}
else
{
GetControlText(hDlg, IDC_EDIT2, lpUserName);
lpUserSOM = ConvertName(lpUserName);
if (lpUserName && !lpUserSOM)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::RSOPGetTargetDlgProc: Failed to convert username %s to DN name with %d."), lpUserName, GetLastError()));
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
ReportError (hDlg, 0, IDS_NOUSER2);
}
else
{
ReportError (hDlg, GetLastError(), IDS_NOUSER);
}
delete [] lpUserName;
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
pCD->EscapeString (&lpUserSOM);
}
if (lpUserSOM)
{
lpFullName = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpUserSOM) + 10) * sizeof(TCHAR));
if (lpFullName)
{
lstrcpy (lpFullName, TEXT("LDAP://"));
lstrcat (lpFullName, lpUserSOM);
hr = OpenDSObject(lpFullName, IID_IDirectoryObject, (void**)&pUserObject);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::RSOPGetTargetDlgProc: Failed to bind to user object %s with %d."), lpFullName, hr));
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
if (lpUserName)
{
delete [] lpUserName;
}
LocalFree (lpFullName);
delete [] lpUserSOM;
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
LocalFree (lpFullName);
}
}
//
// Get the computer and dn name
//
if (IsDlgButtonChecked(hDlg, IDC_RADIO3) == BST_CHECKED)
{
GetControlText(hDlg, IDC_EDIT3, lpComputerSOM);
if (lpComputerSOM)
{
pCD->EscapeString (&lpComputerSOM);
hr = pCD->TestSOM (lpComputerSOM, hDlg);
if (FAILED(hr))
{
if (hr != E_INVALIDARG)
{
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
}
delete [] lpComputerSOM;
if (lpUserName)
{
delete [] lpUserName;
}
if (lpUserSOM)
{
delete [] lpUserSOM;
}
if (pUserObject)
{
pUserObject->Release();
}
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
}
}
else
{
GetControlText(hDlg, IDC_EDIT4, lpComputerName);
if (lpComputerName)
{
lpFullName = new TCHAR [lstrlen(lpComputerName) + 2];
if (lpFullName)
{
lstrcpy (lpFullName, lpComputerName);
lstrcat (lpFullName, TEXT("$"));
lpComputerSOM = ConvertName(lpFullName);
delete [] lpComputerName;
lpComputerName = lpFullName;
}
}
if (lpComputerName && !lpComputerSOM)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::RSOPGetTargetDlgProc: Failed to convert computername %s to DN name with %d."), lpComputerName, GetLastError()));
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
ReportError (hDlg, 0, IDS_NOCOMPUTER2);
}
else
{
ReportError (hDlg, GetLastError(), IDS_NOCOMPUTER);
}
delete [] lpComputerName;
if (lpUserName)
{
delete [] lpUserName;
}
if (lpUserSOM)
{
delete [] lpUserSOM;
}
if (pUserObject)
{
pUserObject->Release();
}
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
pCD->EscapeString (&lpComputerSOM);
}
if (lpComputerSOM)
{
lpFullName = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpComputerSOM) + 10) * sizeof(TCHAR));
if (lpFullName)
{
lstrcpy (lpFullName, TEXT("LDAP://"));
lstrcat (lpFullName, lpComputerSOM);
hr = OpenDSObject(lpFullName, IID_IDirectoryObject, (void**)&pComputerObject);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::RSOPGetTargetDlgProc: Failed to bind to computer object %s with %d."), lpFullName, hr));
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
if (lpComputerName)
{
delete [] lpComputerName;
}
LocalFree (lpFullName);
delete [] lpComputerSOM;
if (lpUserName)
{
delete [] lpUserName;
}
if (lpUserSOM)
{
delete [] lpUserSOM;
}
if (pUserObject)
{
pUserObject->Release();
}
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
LocalFree (lpFullName);
}
}
//
// Store the user information
//
if (pCD->m_szUserName && lpUserName && (!lstrcmpi(pCD->m_szUserName, lpUserName)))
{
delete [] lpUserName;
if (lpUserSOM)
{
delete [] lpUserSOM;
}
if (pUserObject)
{
pUserObject->Release();
}
}
else if (!pCD->m_szUserName && !lpUserName && pCD->m_szUserSOM && lpUserSOM && (!lstrcmpi(pCD->m_szUserSOM, lpUserSOM)))
{
delete [] lpUserSOM;
if (pUserObject)
{
pUserObject->Release();
}
}
else
{
pCD->FreeUserData ();
if (lpUserName)
{
pCD->m_szUserName = lpUserName;
pCD->m_szUserDNName = lpUserSOM;
pCD->m_szDefaultUserSOM = pCD->GetDefaultSOM (lpUserSOM);
}
else
{
pCD->m_szUserSOM = lpUserSOM;
}
pCD->m_pUserObject = pUserObject;
}
//
// Store the computer information
//
if (pCD->m_szComputerName && lpComputerName && (!lstrcmpi(pCD->m_szComputerName, lpComputerName)))
{
delete [] lpComputerName;
if (lpComputerSOM)
{
delete [] lpComputerSOM;
}
if (pComputerObject)
{
pComputerObject->Release();
}
}
else if (!pCD->m_szComputerName && !lpComputerName && pCD->m_szComputerSOM && lpComputerSOM && (!lstrcmpi(pCD->m_szComputerSOM, lpComputerSOM)))
{
delete [] lpComputerSOM;
if (pComputerObject)
{
pComputerObject->Release();
}
}
else
{
pCD->FreeComputerData ();
if (lpComputerName)
{
pCD->m_szComputerName = lpComputerName;
pCD->m_szComputerDNName = lpComputerSOM;
pCD->m_szDefaultComputerSOM = pCD->GetDefaultSOM (lpComputerSOM);
}
else
{
pCD->m_szComputerSOM = lpComputerSOM;
}
pCD->m_pComputerObject = pComputerObject;
}
if (pCD->m_szDC)
{
delete [] pCD->m_szDC;
pCD->m_szDC = NULL;
}
if (pCD->m_szSite)
{
delete [] pCD->m_szSite;
pCD->m_szSite = NULL;
}
if ( (pCD->m_szSitePref) && (!pCD->m_szSite)) {
GetSiteFriendlyName(pCD->m_szSitePref, &(pCD->m_szSite));
}
// set m_szDC to the primary DC
LPTSTR szDomain = NULL;
// Determine the focused domain so we can focus on the correct
// DC.
if (pCD->m_szUserName)
{
//
// try and get the user's domain
//
szDomain = ExtractDomain(pCD->m_szUserName);
}
if (!szDomain && pCD->m_szUserSOM)
{
//
// try and get the user's domain from the SOM
//
szDomain = pCD->GetDomainFromSOM(pCD->m_szUserSOM);
}
if (!szDomain && pCD->m_szComputerName)
{
//
// try and get the computer's domain
//
szDomain = ExtractDomain(pCD->m_szComputerName);
}
if (!szDomain && pCD->m_szComputerSOM)
{
//
// try and get the computer's domain from the SOM
//
szDomain = pCD->GetDomainFromSOM(pCD->m_szComputerSOM);
}
if (!szDomain)
{
//
// use the local domain
//
TCHAR szName[1024];
DWORD dwSize = sizeof(szName) / sizeof(szName[0]);
GetUserNameEx(NameSamCompatible, szName, &dwSize);
szDomain = ExtractDomain(szName);
}
LPTSTR lpDCName;
lpDCName = GetDCName (szDomain, pCD->m_szDCPref, NULL, FALSE, 0, DS_RETURN_DNS_NAME);
if (lpDCName)
{
if (pCD->m_szDC)
{
delete [] pCD->m_szDC;
pCD->m_szDC = NULL;
}
pCD->m_szDC = new WCHAR [ wcslen(lpDCName) + 1];
if (pCD->m_szDC)
{
wcscpy(pCD->m_szDC, lpDCName);
}
LocalFree(lpDCName);
}
if (szDomain)
{
delete [] szDomain;
}
ClearWaitCursor();
}
if (SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_GETCHECK, 0, 0))
{
if (!(pCD->IsComputerRSoPEnabled(pCD->m_szDC))) {
if (GetLastError() == WBEM_E_INVALID_NAMESPACE)
{
ReportError (hDlg, 0, IDS_DEFDC_DOWNLEVEL);
}
else
{
ReportError (hDlg, GetLastError(), IDS_DEFDC_CONNECTFAILED);
}
delete [] pCD->m_szDC;
pCD->m_szDC = NULL;
}
else {
pCD->m_dwSkippedFrom = IDD_RSOP_GETTARGET;
pCD->m_loopbackMode = LoopbackNone;
// skip to the diagnostic pages
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
}
pCD->m_dwSkippedFrom = 0;
break;
case PSN_WIZFINISH:
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
BOOL CRSOPComponentData::IsComputerRSoPEnabled(LPTSTR lpComputerName)
{
LPSTR lpComputerNameA;
LPTSTR lpName, lpWMIPath;
HRESULT hr;
BOOL bRetVal = FALSE;
struct hostent *hostp;
DWORD dwResult, dwSize = (lstrlen(lpComputerName) + 1) * 2;
ULONG inaddr, ulSpeed;
IWbemLocator * pLocator = 0;
IWbemServices * pNamespace = 0;
BSTR bstrPath;
SetLastError(ERROR_SUCCESS);
//
// Allocate memory for a ANSI computer name
//
lpComputerNameA = new CHAR[dwSize];
if (lpComputerNameA)
{
//
// Skip the leading \\ if present
//
if ((*lpComputerName == TEXT('\\')) && (*(lpComputerName+1) == TEXT('\\')))
{
lpName = lpComputerName + 2;
}
else
{
lpName = lpComputerName;
}
//
// Convert the computer name to ANSI
//
if (WideCharToMultiByte (CP_ACP, 0, lpName, -1, lpComputerNameA, dwSize, NULL, NULL))
{
//
// Get the host information for the computer
//
hostp = gethostbyname(lpComputerNameA);
if (hostp)
{
//
// Get the ip address of the computer
//
inaddr = *(long *)hostp->h_addr;
//
// Test if the computer is alive
//
dwResult = PingComputer (inaddr, &ulSpeed);
if (dwResult == ERROR_SUCCESS)
{
//
// Create an instance of the WMI locator
//
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLocator);
if (SUCCEEDED(hr))
{
//
// Try to connect to the rsop namespace
//
dwSize = lstrlen(lpName) + 20;
lpWMIPath = new TCHAR[dwSize];
if (lpWMIPath)
{
wsprintf (lpWMIPath, TEXT("\\\\%s\\root\\rsop"), lpName);
bstrPath = SysAllocString(lpWMIPath);
if (bstrPath)
{
hr = pLocator->ConnectServer(bstrPath,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (SUCCEEDED(hr))
{
//
// Success. This computer has RSOP support
//
pNamespace->Release();
bRetVal = TRUE;
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: ConnectServer for %s failed with 0x%x"), bstrPath, hr));
}
SysFreeString (bstrPath);
//
// Set hr into the last error code. Note, this has to happen after
// the call to SysFreeString since it changes the last error code
// to success
//
if (hr != S_OK)
{
SetLastError(hr);
}
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: SysAllocString failed")));
SetLastError(ERROR_OUTOFMEMORY);
}
delete [] lpWMIPath;
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: Failed to alloc memory for wmi path.")));
SetLastError(ERROR_OUTOFMEMORY);
}
pLocator->Release();
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: CoCreateInstance failed with 0x%x."), hr));
SetLastError((DWORD)hr);
}
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: PingComputer failed with %d."), dwResult));
SetLastError(dwResult);
}
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: gethostbyname failed with %d."), WSAGetLastError()));
SetLastError(WSAGetLastError());
}
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: WideCharToMultiByte failed with %d"), GetLastError()));
}
delete [] lpComputerNameA;
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: Failed to allocate memory for ansi dc name")));
SetLastError(ERROR_OUTOFMEMORY);
}
return bRetVal;
}
INT_PTR CALLBACK CRSOPComponentData::BrowseDCDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
{
pCD = (CRSOPComponentData *) lParam;
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
pCD->InitializeDCInfo(hDlg);
return TRUE;
}
case WM_COMMAND:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
if (LOWORD(wParam) == IDOK)
{
INT iSel, iStrLen;
iSel = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iSel == LB_ERR)
{
break;
}
iStrLen = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETTEXTLEN, (WPARAM) iSel, 0);
if (iStrLen == LB_ERR)
{
break;
}
delete [] pCD->m_szDC;
pCD->m_szDC = new TCHAR[iStrLen+1];
if (!pCD->m_szDC)
{
break;
}
SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETTEXT, (WPARAM) iSel, (LPARAM) pCD->m_szDC);
EndDialog(hDlg, 1);
return TRUE;
}
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, 0);
return TRUE;
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aBrowseDCHelpIds);
break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aBrowseDCHelpIds);
return (TRUE);
}
return FALSE;
}
VOID CRSOPComponentData::InitializeDCInfo (HWND hDlg)
{
LPTSTR szDomain = NULL;
TCHAR szName[1024];
DWORD dwSize, dwError;
INT iDefault = LB_ERR, nPDC = LB_ERR, nCount = 0;
//
// Determine the focused domain so we can focus on the correct
// DC.
if (m_szUserName)
{
//
// Try and get the user's domain
//
szDomain = ExtractDomain(m_szUserName);
}
if (!szDomain && m_szComputerName)
{
//
// Try and get the computer's domain
//
szDomain = ExtractDomain(m_szComputerName);
}
if (!szDomain)
{
//
// Use the local domain
//
dwSize = ARRAYSIZE(szName);
if (GetUserNameEx(NameSamCompatible, szName, &dwSize))
{
szDomain = ExtractDomain(szName);
}
}
if (szDomain)
{
DWORD cInfo;
INT n;
PDS_DOMAIN_CONTROLLER_INFO_1 pInfo = NULL;
HANDLE hDs;
DWORD result;
result = DsBind(NULL, szDomain, &hDs);
if (ERROR_SUCCESS == result)
{
result = DsGetDomainControllerInfo(hDs,
szDomain,
1,
&cInfo,
(void **)&pInfo);
if (ERROR_SUCCESS == result)
{
//
// Enumerate the list
//
for (n = 0; (DWORD)n < cInfo; n++)
{
if (IsComputerRSoPEnabled(pInfo[n].DnsHostName))
{
SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_ADDSTRING, 0, (LPARAM)pInfo[n].DnsHostName);
if (pInfo[n].fIsPdc)
{
nPDC = n;
}
nCount++;
}
else
{
dwError = GetLastError();
}
}
if (nCount)
{
//
// Set the initial selection
//
if (m_szDC)
{
iDefault = (INT) SendMessage (GetDlgItem(hDlg, IDC_LIST1), LB_FINDSTRING,
(WPARAM) -1, (LPARAM) m_szDC);
}
else if (nPDC != LB_ERR)
{
iDefault = (INT) SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_FINDSTRINGEXACT,
(WPARAM) -1, (LPARAM) pInfo[nPDC].DnsHostName);
}
SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_SETCURSEL,
(WPARAM) (iDefault == LB_ERR) ? 0 : iDefault, NULL);
}
else
{
ReportError (hDlg, dwError, IDS_NORSOPDC, szDomain);
}
DsFreeDomainControllerInfo(1, cInfo, pInfo);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeDCInfo: DsGetDomainControllerInfo to %s failed with %d."), szDomain, result));
}
DsUnBind(&hDs);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeDCInfo: DsBind to %s failed with %d."), szDomain, result));
ReportError(hDlg, result, IDS_DSBINDFAILED);
}
delete [] szDomain;
}
}
VOID CRSOPComponentData::InitializeSitesInfo (HWND hDlg)
{
LPTSTR szDomain = NULL;
TCHAR szName[1024];
DWORD dwSize;
PDS_NAME_RESULTW pSites;
int iInitialSite = 0;
int iIndex, iDefault = CB_ERR;
HANDLE hDs;
DWORD dw, n;
SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_RESETCONTENT, 0, 0);
//
// Determine which domain to use for the bind
//
if (m_szUserName)
{
//
// Try and get the user's domain
//
szDomain = ExtractDomain(m_szUserName);
}
if (!szDomain && m_szComputerName)
{
//
// Try and get the computer's domain
//
szDomain = ExtractDomain(m_szComputerName);
}
if (!szDomain)
{
//
// use the local domain
//
dwSize = ARRAYSIZE(szName);
if (GetUserNameEx(NameSamCompatible, szName, &dwSize))
{
szDomain = ExtractDomain(szName);
}
}
//
// Bind to the domain
//
dw = DsBindW(NULL, szDomain, &hDs);
if (dw == ERROR_SUCCESS)
{
//
// If we have a site pref, show only that..
//
if (m_szSitePref) {
LPWSTR szSiteFriendlyName=NULL;
//
// Get the friendly name
//
if (GetSiteFriendlyName(m_szSitePref, &szSiteFriendlyName)) {
SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING,
(WPARAM) 0, (LPARAM) (LPCTSTR) szSiteFriendlyName);
delete [] szSiteFriendlyName;
}
}
else {
//
// Query for the list of sites
//
dw = DsListSitesW(hDs, &pSites);
if (dw == ERROR_SUCCESS)
{
for (n = 0; n < pSites->cItems; n++)
{
//
// Add the site name (if it has a name)
//
if (pSites->rItems[n].pName)
{
LPWSTR szSiteFriendlyName=NULL;
if (GetSiteFriendlyName(pSites->rItems[n].pName, &szSiteFriendlyName)) {
SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING,
(WPARAM) 0, (LPARAM) (LPCTSTR) szSiteFriendlyName);
delete [] szSiteFriendlyName;
}
}
}
DsFreeNameResultW(pSites);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeSitesInfo: DsListSites failed with 0x%x"), dw));
}
}
DsUnBindW(&hDs);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeSitesInfo: DsBindW failed with 0x%x"), dw));
}
if (!m_szSitePref) {
LoadString (g_hInstance, IDS_NONE, szName, ARRAYSIZE(szName));
iIndex = (int) SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING,
(WPARAM) 0, (LPARAM) (LPCTSTR) szName);
}
//
// Set the initial selection
//
if (m_szSitePref) {
iDefault = (INT) SendMessage (GetDlgItem(hDlg, IDC_COMBO1), CB_FINDSTRINGEXACT,
(WPARAM) -1, (LPARAM) m_szSitePref);
}
if (m_szSite)
{
iDefault = (INT) SendMessage (GetDlgItem(hDlg, IDC_COMBO1), CB_FINDSTRINGEXACT,
(WPARAM) -1, (LPARAM) m_szSite);
}
SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_SETCURSEL,
(WPARAM) (iDefault == CB_ERR) ? iIndex : iDefault, NULL);
if (szDomain)
{
delete [] szDomain;
}
}
INT_PTR CALLBACK CRSOPComponentData::RSOPGetDCDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
BOOL bEnable;
switch (message)
{
case WM_INITDIALOG:
{
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
}
break;
case WM_COMMAND:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_CHECK2:
if (SendMessage (GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0))
{
pCD->m_loopbackMode = LoopbackReplace;
SendMessage (GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_CHECKED, 0);
SendMessage (GetDlgItem(hDlg, IDC_RADIO3), BM_SETCHECK, BST_UNCHECKED, 0);
bEnable = TRUE;
if (NULL == pCD->m_szUserName && NULL == pCD->m_szUserSOM)
bEnable = FALSE;
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), bEnable);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), bEnable);
}
else
{
pCD->m_loopbackMode = LoopbackNone;
SendMessage (GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem(hDlg, IDC_RADIO3), BM_SETCHECK, BST_UNCHECKED, 0);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), FALSE);
}
break;
case IDC_RADIO2:
pCD->m_loopbackMode = LoopbackReplace;
break;
case IDC_RADIO3:
pCD->m_loopbackMode = LoopbackMerge;
break;
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
{
SetWaitCursor();
pCD->InitializeSitesInfo (hDlg);
if ((LoopbackNone == pCD->m_loopbackMode) ||
(LoopbackMerge == pCD->m_loopbackMode && ((NULL == pCD->m_szUserName && NULL == pCD->m_szUserSOM) ||
(NULL == pCD->m_szComputerName && NULL == pCD->m_szComputerSOM))
) ||
(LoopbackReplace == pCD->m_loopbackMode && NULL == pCD->m_szComputerName && NULL == pCD->m_szComputerSOM)
)
{
pCD->m_loopbackMode = LoopbackNone;
SendMessage (GetDlgItem(hDlg, IDC_CHECK2), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem(hDlg, IDC_RADIO3), BM_SETCHECK, BST_UNCHECKED, 0);
if (NULL == pCD->m_szComputerName && NULL == pCD->m_szComputerSOM)
EnableWindow (GetDlgItem(hDlg, IDC_CHECK2), FALSE);
else
EnableWindow (GetDlgItem(hDlg, IDC_CHECK2), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), FALSE);
}
else if (LoopbackReplace == pCD->m_loopbackMode)
{
bEnable = TRUE;
if (NULL == pCD->m_szUserName && NULL == pCD->m_szUserSOM)
bEnable = FALSE;
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), bEnable);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), bEnable);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
ClearWaitCursor();
}
break;
case PSN_WIZNEXT:
SetWaitCursor();
GetControlText(hDlg, IDC_COMBO1, pCD->m_szSite);
if (pCD->m_szSite)
{
TCHAR szName[30];
LoadString (g_hInstance, IDS_NONE, szName, ARRAYSIZE(szName));
if (!lstrcmpi(pCD->m_szSite, szName))
{
delete [] pCD->m_szSite;
pCD->m_szSite = NULL;
}
}
if (SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0))
{
pCD->m_bSlowLink = TRUE;
}
else
{
pCD->m_bSlowLink = FALSE;
}
ClearWaitCursor();
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
pCD->m_dwSkippedFrom = IDD_RSOP_GETDC;
// skip to the diagnostic pages
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
if ((NULL == pCD->m_szUserName) && (NULL == pCD->m_szComputerName))
{
pCD->m_dwSkippedFrom = IDD_RSOP_GETDC;
if (pCD->m_szUserSOM || LoopbackNone != pCD->m_loopbackMode)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTUSERSEC);
}
else if (pCD->m_szComputerSOM)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTCOMPSEC);
}
else
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
}
return TRUE;
}
pCD->m_dwSkippedFrom = 0;
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
HRESULT CRSOPComponentData::TestSOM (LPTSTR lpSOM, HWND hDlg)
{
HRESULT hr = E_OUTOFMEMORY;
LPTSTR lpFullName;
IDirectoryObject * pObject;
ADS_OBJECT_INFO *pInfo;
if (!lpSOM)
{
return E_INVALIDARG;
}
lpFullName = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpSOM) + 10) * sizeof(TCHAR));
if (lpFullName)
{
lstrcpy (lpFullName, TEXT("LDAP://"));
lstrcat (lpFullName, lpSOM);
hr = OpenDSObject(lpFullName, IID_IDirectoryObject, (void**)&pObject);
if (SUCCEEDED(hr))
{
hr = pObject->GetObjectInformation (&pInfo);
if (SUCCEEDED(hr))
{
if (!lstrcmpi (pInfo->pszClassName, TEXT("user")))
{
hr = E_INVALIDARG;
ReportError (hDlg, hr, IDS_BADUSERSOM);
}
else if (!lstrcmpi (pInfo->pszClassName, TEXT("computer")))
{
hr = E_INVALIDARG;
ReportError (hDlg, hr, IDS_BADCOMPUTERSOM);
}
FreeADsMem (pInfo);
}
pObject->Release();
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestSOM: OpenDSObject to %s failed with 0x%x"), lpFullName, hr));
}
LocalFree (lpFullName);
}
return hr;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPAltDirsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
break;
case WM_COMMAND:
{
DSBROWSEINFO dsbi = {0};
TCHAR szResult[MAX_PATH];
TCHAR szTitle[256];
TCHAR szCaption[256];
dsbi.hwndOwner = hDlg;
dsbi.pszCaption = szTitle;
dsbi.pszTitle = szCaption;
dsbi.cbStruct = sizeof(dsbi);
dsbi.pszPath = szResult;
dsbi.cchPath = ARRAYSIZE(szResult);
dsbi.dwFlags = DSBI_ENTIREDIRECTORY;
dsbi.pfnCallback = DsBrowseCallback;
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
// browse for user's OU
{
LoadString(g_hInstance,
IDS_BROWSE_USER_OU_TITLE,
szTitle,
ARRAYSIZE(szTitle));
LoadString(g_hInstance,
IDS_BROWSE_USER_OU_CAPTION,
szCaption,
ARRAYSIZE(szCaption));
if (IDOK == DsBrowseForContainer(&dsbi))
{
SetDlgItemText(hDlg, IDC_EDIT1, (szResult+7));
}
}
break;
case IDC_BUTTON2:
// browse for computer's OU
{
LoadString(g_hInstance,
IDS_BROWSE_COMPUTER_OU_TITLE,
szTitle,
ARRAYSIZE(szTitle));
LoadString(g_hInstance,
IDS_BROWSE_COMPUTER_OU_CAPTION,
szCaption,
ARRAYSIZE(szCaption));
if (IDOK == DsBrowseForContainer(&dsbi))
{
SetDlgItemText(hDlg, IDC_EDIT2, (szResult+7));
}
}
break;
case IDC_BUTTON3:
if (IsWindowEnabled (GetDlgItem(hDlg, IDC_EDIT1)))
{
if (pCD->m_szDefaultUserSOM)
{
SetDlgItemText (hDlg, IDC_EDIT1, pCD->m_szDefaultUserSOM);
}
}
if (IsWindowEnabled (GetDlgItem(hDlg, IDC_EDIT2)))
{
if (pCD->m_szDefaultComputerSOM)
{
SetDlgItemText (hDlg, IDC_EDIT2, pCD->m_szDefaultComputerSOM);
}
}
break;
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
SetDlgItemText (hDlg, IDC_EDIT1, TEXT(""));
if (pCD->m_szUserSOM)
{
SetDlgItemText (hDlg, IDC_EDIT1, pCD->m_szUserSOM);
if (!pCD->m_szUserName)
{
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
}
}
else if (pCD->m_szDefaultUserSOM)
{
SetDlgItemText (hDlg, IDC_EDIT1, pCD->m_szDefaultUserSOM);
}
else if (!pCD->m_szUserName)
{
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
}
EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
SetDlgItemText (hDlg, IDC_EDIT2, TEXT(""));
if (pCD->m_szComputerSOM)
{
SetDlgItemText (hDlg, IDC_EDIT2, pCD->m_szComputerSOM);
if (!pCD->m_szComputerName)
{
EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
}
else if (pCD->m_szDefaultComputerSOM)
{
SetDlgItemText (hDlg, IDC_EDIT2, pCD->m_szDefaultComputerSOM);
}
else if (!pCD->m_szComputerName)
{
EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
if (IsWindowEnabled (GetDlgItem(hDlg, IDC_EDIT1)) ||
IsWindowEnabled (GetDlgItem(hDlg, IDC_EDIT2)))
{
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
}
break;
case PSN_WIZNEXT:
{
LPTSTR lpUserSOM = NULL, lpComputerSOM = NULL;
HRESULT hr;
GetControlText(hDlg, IDC_EDIT1, lpUserSOM);
GetControlText(hDlg, IDC_EDIT2, lpComputerSOM);
if (lpUserSOM)
{
hr = pCD->TestSOM (lpUserSOM, hDlg);
if (FAILED(hr))
{
if (hr != E_INVALIDARG)
{
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
}
if (lpUserSOM)
{
delete [] lpUserSOM;
}
if (lpComputerSOM)
{
delete [] lpComputerSOM;
}
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
}
if (lpComputerSOM)
{
hr = pCD->TestSOM (lpComputerSOM, hDlg);
if (FAILED(hr))
{
if (hr != E_INVALIDARG)
{
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
}
if (lpUserSOM)
{
delete [] lpUserSOM;
}
if (lpComputerSOM)
{
delete [] lpComputerSOM;
}
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
}
pCD->m_szUserSOM = lpUserSOM;
pCD->m_szComputerSOM = lpComputerSOM;
if (pCD->m_szDefaultUserSOM && pCD->m_szUserSOM)
{
if (!lstrcmpi(pCD->m_szDefaultUserSOM, pCD->m_szUserSOM))
{
delete [] pCD->m_szUserSOM;
pCD->m_szUserSOM = NULL;
}
}
if (pCD->m_szDefaultComputerSOM && pCD->m_szComputerSOM)
{
if (!lstrcmpi(pCD->m_szDefaultComputerSOM, pCD->m_szComputerSOM))
{
delete [] pCD->m_szComputerSOM;
pCD->m_szComputerSOM = NULL;
}
}
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
pCD->m_dwSkippedFrom = IDD_RSOP_ALTDIRS;
// skip to the diagnostic pages
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
if ((NULL == pCD->m_szUserName) && (NULL == pCD->m_szUserSOM))
{
pCD->m_dwSkippedFrom = IDD_RSOP_ALTDIRS;
if (pCD->m_szComputerName || pCD->m_szComputerSOM)
{
if (LoopbackNone == pCD->m_loopbackMode)
{
// skip to the alternate computer security page
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTCOMPSEC);
}
else
{
// Skip to the alternate user security page if simulating loopback mode
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTUSERSEC);
}
}
else
{
// skip to the finish page
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
}
return TRUE;
}
pCD->m_dwSkippedFrom = 0;
}
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
VOID CRSOPComponentData::AddDefaultGroups (HWND hLB)
{
SID_IDENTIFIER_AUTHORITY authNT = SECURITY_NT_AUTHORITY;
SID_IDENTIFIER_AUTHORITY authWORLD = SECURITY_WORLD_SID_AUTHORITY;
PSID psidUser, psidEveryone;
DWORD dwNameSize, dwDomainSize;
TCHAR szName[200];
TCHAR szDomain[50];
SID_NAME_USE SidName;
INT iIndex;
//
// Get the authenticated users sid
//
if (AllocateAndInitializeSid(&authNT, 1, SECURITY_AUTHENTICATED_USER_RID,
0, 0, 0, 0, 0, 0, 0, &psidUser))
{
//
// Get the friendly display name and add it to the list
//
dwNameSize = ARRAYSIZE(szName);
dwDomainSize = ARRAYSIZE(szDomain);
if (LookupAccountSid (NULL, psidUser, szName, &dwNameSize,
szDomain, &dwDomainSize, &SidName))
{
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) szName);
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) 1);
}
FreeSid(psidUser);
}
//
// Get the everyone sid
//
if (AllocateAndInitializeSid(&authWORLD, 1, SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0, &psidEveryone))
{
//
// Get the friendly display name and add it to the list
//
dwNameSize = ARRAYSIZE(szName);
dwDomainSize = ARRAYSIZE(szDomain);
if (LookupAccountSid (NULL, psidEveryone, szName, &dwNameSize,
szDomain, &dwDomainSize, &SidName))
{
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) szName);
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) 1);
}
FreeSid(psidEveryone);
}
}
VOID CRSOPComponentData::GetPrimaryGroup (HWND hLB, IDirectoryObject * pDSObj)
{
HRESULT hr;
PADS_ATTR_INFO spAttrs;
WCHAR wzObjectSID[] = L"objectSid";
WCHAR wzPrimaryGroup[] = L"primaryGroupID";
PWSTR rgpwzAttrNames[] = {wzObjectSID, wzPrimaryGroup};
DWORD cAttrs = 2, i;
DWORD dwOriginalPriGroup;
LPBYTE pObjSID = NULL;
UCHAR * psaCount, iIndex;
PSID pSID = NULL;
PSID_IDENTIFIER_AUTHORITY psia;
DWORD rgRid[8];
TCHAR szName[200];
TCHAR szDomain[300];
TCHAR szFullName[501];
DWORD dwNameSize, dwDomainSize;
SID_NAME_USE SidName;
//
// Get the SID and perhaps the Primary Group attribute values.
//
hr = pDSObj->GetObjectAttributes(rgpwzAttrNames, cAttrs, &spAttrs, &cAttrs);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: GetObjectAttributes failed with 0x%x"), hr));
return;
}
for (i = 0; i < cAttrs; i++)
{
if (_wcsicmp(spAttrs[i].pszAttrName, wzPrimaryGroup) == 0)
{
dwOriginalPriGroup = spAttrs[i].pADsValues->Integer;
continue;
}
if (_wcsicmp(spAttrs[i].pszAttrName, wzObjectSID) == 0)
{
pObjSID = new BYTE[spAttrs[i].pADsValues->OctetString.dwLength];
if (!pObjSID)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: Failed to allocate memory for sid with %d"), GetLastError()));
goto Exit;
}
memcpy(pObjSID, spAttrs[i].pADsValues->OctetString.lpValue,
spAttrs[i].pADsValues->OctetString.dwLength);
}
}
if (!IsValidSid (pObjSID))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: SID is not valid.")));
goto Exit;
}
psaCount = GetSidSubAuthorityCount(pObjSID);
if (psaCount == NULL)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: GetSidSubAuthorityCount failed with %d"), GetLastError()));
goto Exit;
}
if (*psaCount > 8)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: psaCount is greater than 8")));
goto Exit;
}
for (iIndex = 0; iIndex < (*psaCount - 1); iIndex++)
{
PDWORD pRid = GetSidSubAuthority(pObjSID, (DWORD)iIndex);
if (pRid == NULL)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: GetSidSubAuthority failed with %d"), GetLastError()));
goto Exit;
}
rgRid[iIndex] = *pRid;
}
rgRid[*psaCount - 1] = dwOriginalPriGroup;
for (iIndex = *psaCount; iIndex < 8; iIndex++)
{
rgRid[iIndex] = 0;
}
psia = GetSidIdentifierAuthority(pObjSID);
if (psia == NULL)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: GetSidIdentifierAuthorityCount failed with %d"), GetLastError()));
goto Exit;
}
if (!AllocateAndInitializeSid(psia, *psaCount, rgRid[0], rgRid[1],
rgRid[2], rgRid[3], rgRid[4],
rgRid[5], rgRid[6], rgRid[7], &pSID))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: AllocateAndInitializeSid failed with %d"), GetLastError()));
goto Exit;
}
dwNameSize = ARRAYSIZE(szName);
dwDomainSize = ARRAYSIZE(szDomain);
if (LookupAccountSid (NULL, pSID, szName, &dwNameSize, szDomain, &dwDomainSize,
&SidName))
{
wsprintf (szFullName, TEXT("%s\\%s"), szDomain, szName);
SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) szFullName);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: LookupAccountSid failed with %d"), GetLastError()));
}
FreeSid (pSID);
Exit:
FreeADsMem (spAttrs);
if (pObjSID)
{
delete [] pObjSID;
}
}
HRESULT CRSOPComponentData::BuildMembershipList (HWND hLB, IDirectoryObject * pDSObj, SAFEARRAY **psaSecGrp, DWORD ** pdwSecGrpAttr)
{
HRESULT hr;
PADS_ATTR_INFO spAttrs;
DWORD i, j, cAttrs = 0;
WCHAR wzMembershipAttr[MAX_PATH] = L"memberOf;range=0-*";
const WCHAR wcSep = L'-';
const WCHAR wcEnd = L'*';
const WCHAR wzFormat[] = L"memberOf;range=%ld-*";
BOOL fMoreRemain = FALSE;
PWSTR rgpwzAttrNames[] = {wzMembershipAttr};
TCHAR szDisplayName[MAX_PATH];
ULONG ulSize;
LPTSTR lpFullName, lpTemp;
IADs * pGroup;
VARIANT varType;
SetWaitCursor();
SendMessage (hLB, WM_SETREDRAW, FALSE, 0);
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
AddDefaultGroups (hLB);
if (!pDSObj)
goto BuildMembershipListEnd;
GetPrimaryGroup (hLB, pDSObj);
//
// Read the membership list from the object. First read the attribute off
// of the actual object which will give all memberships in the object's
// domain (including local groups which are not replicated to the GC).
//
do
{
hr = pDSObj->GetObjectAttributes(rgpwzAttrNames, 1, &spAttrs, &cAttrs);
if (SUCCEEDED(hr))
{
if (cAttrs > 0 && spAttrs != NULL)
{
for (i = 0; i < spAttrs->dwNumValues; i++)
{
ulSize = (lstrlen(spAttrs->pADsValues[i].CaseIgnoreString) + 10);
lpFullName = (LPTSTR) LocalAlloc (LPTR, ulSize * sizeof(TCHAR));
if (lpFullName)
{
lstrcpy (lpFullName, TEXT("LDAP://"));
lstrcat (lpFullName, spAttrs->pADsValues[i].CaseIgnoreString);
hr = OpenDSObject(lpFullName, IID_IADs, (void**)&pGroup);
if (SUCCEEDED(hr))
{
if (SUCCEEDED(pGroup->Get(TEXT("groupType"), &varType)))
{
if ( varType.lVal & 0x80000000)
{
if ( varType.lVal & 0x5)
{
lpTemp = lpFullName;
while (*lpTemp && (*lpTemp != TEXT(',')))
{
lpTemp++;
}
if (*lpTemp)
{
*lpTemp = TEXT('\0');
SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) (lpFullName+10));
}
}
else
{
if (TranslateName (spAttrs->pADsValues[i].CaseIgnoreString, NameFullyQualifiedDN,
NameSamCompatible, lpFullName, &ulSize))
{
SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) lpFullName);
}
}
}
VariantClear (&varType);
}
pGroup->Release();
}
LocalFree (lpFullName);
}
}
//
// Check to see if there is more data. If the last char of the
// attribute name string is an asterisk, then we have everything.
//
int cchEnd = wcslen(spAttrs->pszAttrName);
fMoreRemain = spAttrs->pszAttrName[cchEnd - 1] != wcEnd;
if (fMoreRemain)
{
PWSTR pwz = wcsrchr(spAttrs->pszAttrName, wcSep);
if (!pwz)
{
fMoreRemain = FALSE;
}
else
{
pwz++; // move past the hyphen to the range end value.
long lEnd = _wtol(pwz);
lEnd++; // start with the next value.
wsprintfW(wzMembershipAttr, wzFormat, lEnd);
DebugMsg((DM_VERBOSE, TEXT("Range returned is %s, now asking for %s"),
spAttrs->pszAttrName, wzMembershipAttr));
}
}
}
FreeADsMem (spAttrs);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildMembershipList: GetObjectAttributes failed with 0x%s"), hr));
}
} while (fMoreRemain);
BuildMembershipListEnd:
SendMessage (hLB, LB_SETCURSEL, 0, 0);
SendMessage (hLB, WM_SETREDRAW, TRUE, 0);
UpdateWindow (hLB);
SaveSecurityGroups (hLB, psaSecGrp, pdwSecGrpAttr);
ClearWaitCursor();
return S_OK;
}
HRESULT CRSOPComponentData::SaveSecurityGroups (HWND hLB, SAFEARRAY **psaSecGrp, DWORD **pdwSecGrpAttr)
{
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[1];
LONG i, lCount = (LONG) SendMessage (hLB, LB_GETCOUNT, 0, 0);
DWORD dwLen;
LPTSTR lpText;
BSTR bstrText;
HRESULT hr;
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lCount;
*pdwSecGrpAttr = (DWORD *)LocalAlloc(LPTR, sizeof(DWORD)*lCount);
psa = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if ((!psa) || (!(*pdwSecGrpAttr)))
{
return E_OUTOFMEMORY;
}
for (i = 0; i < lCount; i++)
{
dwLen = (DWORD) SendMessage (hLB, LB_GETTEXTLEN, (WPARAM) i, 0);
if (dwLen != LB_ERR)
{
lpText = (LPTSTR) LocalAlloc (LPTR, (dwLen+2) * sizeof(TCHAR));
if (lpText)
{
if (SendMessage (hLB, LB_GETTEXT, (WPARAM) i, (LPARAM) lpText) != LB_ERR)
{
LONG lFlags;
BOOL bDollarRemoved;
lFlags = (LONG) SendMessage (hLB, LB_GETITEMDATA, (WPARAM) i, 0);
bDollarRemoved = (lFlags & 2);
if (bDollarRemoved) {
lpText[wcslen(lpText)] = L'$';
}
if (lFlags & 1) { // default grps
(*pdwSecGrpAttr)[i] = 1;
}
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(psa, &i, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::SaveSecurityGroups: SafeArrayPutElement failed with 0x%x."), hr));
}
}
}
LocalFree (lpText);
}
}
}
*psaSecGrp = psa;
return S_OK;
}
VOID CRSOPComponentData::FillListFromSafeArraySecurityGroup (HWND hLB, SAFEARRAY * psa, DWORD * pdwSecGrpAttr)
{
LONG lIndex, lMax;
LPTSTR lpText;
SetWaitCursor();
SendMessage (hLB, WM_SETREDRAW, FALSE, 0);
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
if (psa)
{
if (SUCCEEDED(SafeArrayGetUBound (psa, 1, &lMax)))
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(psa, &lIndex, &lpText)))
{
BOOL bDollarRemoved = FALSE;
if (lpText[wcslen(lpText)-1] == L'$')
{
bDollarRemoved = TRUE;
lpText[wcslen(lpText)-1] = 0;
}
INT iIndex;
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) lpText);
if (pdwSecGrpAttr[lIndex] & 1) {
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) 1);
}
else {
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) (bDollarRemoved) ? 2 : 0);
}
// we just modified it, set it back
if (bDollarRemoved) {
lpText[wcslen(lpText)] = L'$';
}
}
}
}
}
SendMessage (hLB, LB_SETCURSEL, 0, 0);
SendMessage (hLB, WM_SETREDRAW, TRUE, 0);
UpdateWindow (hLB);
ClearWaitCursor();
}
BOOL CRSOPComponentData::CompareSafeArrays(SAFEARRAY *psa1, SAFEARRAY *psa2)
{
LONG lIndex1, lMax1;
LONG lIndex2, lMax2;
LPTSTR lpText1;
LPTSTR lpText2;
BOOL bFound;
//
// Null ptr checks
//
if (!psa1 && !psa2)
{
return TRUE;
}
if (!psa1 && psa2)
{
return FALSE;
}
if (psa1 && !psa2)
{
return FALSE;
}
//
// Get the array sizes
//
if (FAILED(SafeArrayGetUBound (psa1, 1, &lMax1)))
{
return FALSE;
}
if (FAILED(SafeArrayGetUBound (psa2, 1, &lMax2)))
{
return FALSE;
}
//
// Check if the same number of entries are in the arrays
//
if (lMax1 != lMax2)
{
return FALSE;
}
//
// Loop through comparing item by item
//
for (lIndex1 = 0; lIndex1 <= lMax1; lIndex1++)
{
if (FAILED(SafeArrayGetElement(psa1, &lIndex1, &lpText1)))
{
return FALSE;
}
bFound = FALSE;
for (lIndex2 = 0; lIndex2 <= lMax2; lIndex2++)
{
if (FAILED(SafeArrayGetElement(psa2, &lIndex2, &lpText2)))
{
return FALSE;
}
if (!lstrcmpi(lpText1, lpText2))
{
bFound = TRUE;
}
}
if (!bFound)
{
return FALSE;
}
}
return TRUE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPAltUserSecDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
{
TCHAR * sz;
ImplementBrowseButton(hDlg, (DSOP_FILTER_UNIVERSAL_GROUPS_SE | DSOP_FILTER_GLOBAL_GROUPS_SE | DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE),
(DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS),
(DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS),
GetDlgItem(hDlg, IDC_LIST1), sz);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON2:
{
INT iIndex;
iIndex = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iIndex != LB_ERR)
{
if ((SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETITEMDATA, (WPARAM) iIndex, 0) & 1) == 0)
{
SendDlgItemMessage (hDlg, IDC_LIST1, LB_DELETESTRING, (WPARAM) iIndex, 0);
SendDlgItemMessage (hDlg, IDC_LIST1, LB_SETCURSEL, (WPARAM) iIndex, 0);
}
}
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON3:
{
if (pCD->m_saUserSecurityGroups)
{
SafeArrayDestroy (pCD->m_saUserSecurityGroups);
pCD->m_saUserSecurityGroups = NULL;
}
pCD->FillListFromSafeArraySecurityGroup(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saDefaultUserSecurityGroups, pCD->m_saDefaultUserSecurityGroupsAttr);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_LIST1:
if (HIWORD(wParam) == LBN_SELCHANGE)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
}
}
break;
case WM_REFRESHDISPLAY:
if (SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCOUNT, 0, 0) > 0)
{
INT iIndex;
iIndex = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iIndex != LB_ERR)
{
if ((SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETITEMDATA, (WPARAM) iIndex, 0) & 1) == 0)
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
}
} else {
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
if (pCD->m_saUserSecurityGroups)
{
pCD->FillListFromSafeArraySecurityGroup(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saUserSecurityGroups, pCD->m_saUserSecurityGroupsAttr);
}
else if (pCD->m_saDefaultUserSecurityGroups)
{
pCD->FillListFromSafeArraySecurityGroup(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saDefaultUserSecurityGroups, pCD->m_saDefaultUserSecurityGroupsAttr);
}
else
{
pCD->BuildMembershipList (GetDlgItem(hDlg, IDC_LIST1), pCD->m_pUserObject, &(pCD->m_saDefaultUserSecurityGroups), &(pCD->m_saDefaultUserSecurityGroupsAttr));
}
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case PSN_WIZNEXT:
//
// Free the previous list of security groups
//
if (pCD->m_saUserSecurityGroups)
{
SafeArrayDestroy (pCD->m_saUserSecurityGroups);
}
if (pCD->m_saUserSecurityGroupsAttr) {
LocalFree(pCD->m_saUserSecurityGroupsAttr);
}
//
// Save the current list
//
pCD->SaveSecurityGroups (GetDlgItem(hDlg, IDC_LIST1), &(pCD->m_saUserSecurityGroups), &(pCD->m_saUserSecurityGroupsAttr));
//
// Compare the current list with the default list. If the default list
// matches the current list, then delete the current list and just use
// the defaults
//
if (pCD->CompareSafeArrays(pCD->m_saUserSecurityGroups, pCD->m_saDefaultUserSecurityGroups))
{
if (pCD->m_saUserSecurityGroups)
{
SafeArrayDestroy (pCD->m_saUserSecurityGroups);
pCD->m_saUserSecurityGroups = NULL;
}
}
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
pCD->m_dwSkippedFrom = IDD_RSOP_ALTUSERSEC;
// skip to the diagnostic pages
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
if ((NULL == pCD->m_szComputerName) && (NULL == pCD->m_szComputerSOM))
{
// skip to the finish page
pCD->m_dwSkippedFrom = IDD_RSOP_ALTUSERSEC;
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLUSER);
return TRUE;
}
pCD->m_dwSkippedFrom = 0;
break;
case PSN_WIZBACK:
//
// Free the previous list of security groups
//
if (pCD->m_saUserSecurityGroups)
{
SafeArrayDestroy (pCD->m_saUserSecurityGroups);
}
if (pCD->m_saUserSecurityGroupsAttr) {
LocalFree(pCD->m_saUserSecurityGroupsAttr);
}
//
// Save the current list
//
pCD->SaveSecurityGroups (GetDlgItem(hDlg, IDC_LIST1), &(pCD->m_saUserSecurityGroups), &(pCD->m_saUserSecurityGroupsAttr));
if (!pCD->m_szUserName && !pCD->m_szComputerName)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETDC);
return TRUE;
}
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPAltCompSecDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
{
TCHAR * sz;
ImplementBrowseButton(hDlg, (DSOP_FILTER_UNIVERSAL_GROUPS_SE | DSOP_FILTER_GLOBAL_GROUPS_SE | DSOP_FILTER_DOMAIN_LOCAL_GROUPS_SE),
(DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS),
(DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS),
GetDlgItem(hDlg, IDC_LIST1), sz);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON2:
{
INT iIndex;
iIndex = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iIndex != LB_ERR)
{
if ((SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETITEMDATA, (WPARAM) iIndex, 0) & 1) == 0)
{
SendDlgItemMessage (hDlg, IDC_LIST1, LB_DELETESTRING, (WPARAM) iIndex, 0);
SendDlgItemMessage (hDlg, IDC_LIST1, LB_SETCURSEL, (WPARAM) iIndex, 0);
}
}
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON3:
{
if (pCD->m_saComputerSecurityGroups)
{
SafeArrayDestroy (pCD->m_saComputerSecurityGroups);
pCD->m_saComputerSecurityGroups = NULL;
}
pCD->FillListFromSafeArraySecurityGroup(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saDefaultComputerSecurityGroups, pCD->m_saDefaultComputerSecurityGroupsAttr);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_LIST1:
if (HIWORD(wParam) == LBN_SELCHANGE)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
}
}
break;
case WM_REFRESHDISPLAY:
if (SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCOUNT, 0, 0) > 0)
{
INT iIndex;
iIndex = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iIndex != LB_ERR)
{
if ((SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETITEMDATA, (WPARAM) iIndex, 0) & 1) == 0)
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
}
} else {
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
if (pCD->m_saComputerSecurityGroups)
{
pCD->FillListFromSafeArraySecurityGroup(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saComputerSecurityGroups, pCD->m_saComputerSecurityGroupsAttr);
}
else if (pCD->m_saDefaultComputerSecurityGroups)
{
pCD->FillListFromSafeArraySecurityGroup(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saDefaultComputerSecurityGroups, pCD->m_saDefaultComputerSecurityGroupsAttr);
}
else
{
pCD->BuildMembershipList (GetDlgItem(hDlg, IDC_LIST1), pCD->m_pComputerObject, &(pCD->m_saDefaultComputerSecurityGroups), &(pCD->m_saDefaultComputerSecurityGroupsAttr));
}
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case PSN_WIZNEXT:
//
// Free the previous list of security groups
//
if (pCD->m_saComputerSecurityGroups)
{
SafeArrayDestroy (pCD->m_saComputerSecurityGroups);
}
if (pCD->m_saComputerSecurityGroupsAttr)
{
LocalFree (pCD->m_saComputerSecurityGroupsAttr);
}
//
// Save the current list
//
pCD->SaveSecurityGroups (GetDlgItem(hDlg, IDC_LIST1), &(pCD->m_saComputerSecurityGroups), &(pCD->m_saComputerSecurityGroupsAttr));
//
// Compare the current list with the default list. If the default list
// matches the current list, then delete the current list and just use
// the defaults
//
if (pCD->CompareSafeArrays(pCD->m_saComputerSecurityGroups, pCD->m_saDefaultComputerSecurityGroups))
{
if (pCD->m_saComputerSecurityGroups)
{
SafeArrayDestroy (pCD->m_saComputerSecurityGroups);
pCD->m_saComputerSecurityGroups = NULL;
}
}
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
pCD->m_dwSkippedFrom = IDD_RSOP_ALTCOMPSEC;
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
if ((NULL == pCD->m_szUserName) && (NULL == pCD->m_szUserSOM) && (LoopbackNone == pCD->m_loopbackMode))
{
pCD->m_dwSkippedFrom = IDD_RSOP_ALTCOMPSEC;
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLCOMP);
return TRUE;
}
pCD->m_dwSkippedFrom = 0;
break;
case PSN_WIZBACK:
//
// Free the previous list of security groups
//
if (pCD->m_saComputerSecurityGroups)
{
SafeArrayDestroy (pCD->m_saComputerSecurityGroups);
}
if (pCD->m_saComputerSecurityGroupsAttr)
{
LocalFree (pCD->m_saComputerSecurityGroupsAttr);
}
//
// Save the current list
//
pCD->SaveSecurityGroups (GetDlgItem(hDlg, IDC_LIST1), &(pCD->m_saComputerSecurityGroups), &(pCD->m_saComputerSecurityGroupsAttr));
if (!pCD->m_szUserName && !pCD->m_szUserSOM)
{
if (pCD->m_szComputerName)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTDIRS);
}
else
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETDC);
}
return TRUE;
}
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
HRESULT CRSOPComponentData::ExtractWQLFilters (LPTSTR lpNameSpace, SAFEARRAY **psaNamesArg, SAFEARRAY **psaDataArg)
{
HRESULT hr;
ULONG n;
IWbemClassObject * pObjGPO = NULL;
IEnumWbemClassObject * pEnum = NULL;
BSTR strQueryLanguage = SysAllocString(TEXT("WQL"));
BSTR strQuery = SysAllocString(TEXT("SELECT * FROM RSOP_GPO"));
BSTR bstrFilterId = NULL;
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
LPTSTR lpDisplayName;
INT iIndex;
SAFEARRAY * psaNames, *psaData;
SAFEARRAYBOUND rgsabound[1];
BSTR *pWQLFilterIds, bstrText;
LONG lCount=0, lCountAllocated = 0, l=0;
psaNames = psaData = NULL;
pWQLFilterIds = NULL;
//
// Get a locator instance
//
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *)&pLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: CoCreateInstance failed with 0x%x"), hr));
goto cleanup;
}
//
// Connect to the namespace
//
hr = pLocator->ConnectServer(lpNameSpace,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: ConnectServer failed with 0x%x"), hr));
goto cleanup;
}
//
// Query for the RSOP_GPO instances
//
hr = pNamespace->ExecQuery(strQueryLanguage,
strQuery,
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnum);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: ExecQuery failed with 0x%x"), hr));
goto cleanup;
}
// allocate mem. 10 should be enough for most cases
pWQLFilterIds = (BSTR *)LocalAlloc(LPTR, sizeof(BSTR)*(lCountAllocated+10));
if (!pWQLFilterIds) {
hr = HRESULT_FROM_WIN32(GetLastError());
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: LocalAlloc failed with 0x%x"), hr));
goto cleanup;
}
lCountAllocated += 10;
//
// Loop through the results
//
while (TRUE)
{
//
// Get one instance of RSOP_GPO
//
hr = pEnum->Next(WBEM_INFINITE, 1, &pObjGPO, &n);
if (FAILED(hr) || (n == 0))
{
hr = S_OK;
break;
}
//
// Allocate more memory if necessary
//
if (lCount == lCountAllocated) {
BSTR *pNewWQLFilterIds = (BSTR *)LocalAlloc(LPTR, sizeof(BSTR)*(lCountAllocated+10));
if (!pNewWQLFilterIds) {
hr = HRESULT_FROM_WIN32(GetLastError());
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: LocalAlloc failed with 0x%x"), hr));
goto cleanup;
}
lCountAllocated += 10;
for (l=0; l < lCount; l++) {
pNewWQLFilterIds[l] = pWQLFilterIds[l];
}
LocalFree(pWQLFilterIds);
pWQLFilterIds = pNewWQLFilterIds;
}
//
// Get the filter id
//
pWQLFilterIds[lCount] = NULL;
hr = GetParameterBSTR(pObjGPO, TEXT("filterId"), pWQLFilterIds[lCount]);
if (FAILED(hr))
{
goto LoopAgain;
}
if (!pWQLFilterIds[lCount] || !(*pWQLFilterIds[lCount]) || (*pWQLFilterIds[lCount] == TEXT(' ')))
{
if (pWQLFilterIds[lCount]) {
SysFreeString(pWQLFilterIds[lCount]);
}
goto LoopAgain;
}
#ifdef DBG
BSTR bstrGPOName;
bstrGPOName = NULL;
hr = GetParameterBSTR(pObjGPO, TEXT("name"), bstrGPOName);
if ( (SUCCEEDED(hr)) && (bstrGPOName) )
{
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: Found filter on GPO <%s>"), bstrGPOName));
SysFreeString (bstrGPOName);
bstrGPOName = NULL;
}
hr = S_OK;
#endif
//
// eliminate duplicates
//
for (l=0; l < lCount; l++) {
if (lstrcmpi(pWQLFilterIds[lCount], pWQLFilterIds[l]) == 0) {
break;
}
}
if ((lCount != 0) && (l != lCount)) {
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: filter = <%s> is a duplicate"), pWQLFilterIds[lCount]));
SysFreeString(pWQLFilterIds[lCount]);
goto LoopAgain;
}
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: filter = <%s>"), pWQLFilterIds[lCount]));
lCount++;
LoopAgain:
pObjGPO->Release();
pObjGPO = NULL;
}
//
// Now allocate safe arrays.
// Notice that safe array is always allocated even if there are zero filters
//
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lCount;
psaNames = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (!psaNames)
{
hr = E_FAIL;
goto cleanup;
}
psaData = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (!psaData)
{
SafeArrayDestroy (psaNames);
hr = E_FAIL;
goto cleanup;
}
for (l = 0; l < lCount; l++) {
hr = SafeArrayPutElement(psaData, &l, pWQLFilterIds[l]);
if (SUCCEEDED(hr))
{
//
// Get the filter's friendly display name
//
lpDisplayName = GetWMIFilterDisplayName (NULL, pWQLFilterIds[l], FALSE, TRUE);
if (!lpDisplayName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: Failed to get display name for filter id: %s"), pWQLFilterIds[l]));
bstrText = SysAllocString(pWQLFilterIds[l]);
}
else {
bstrText = SysAllocString(lpDisplayName);
delete lpDisplayName;
}
if (!bstrText) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: Failed to Allocate memory for displayname")));
hr = E_FAIL;
goto cleanup;
}
hr = SafeArrayPutElement(psaNames, &l, bstrText);
SysFreeString(bstrText);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: Failed to get display name for filter id: %s"), pWQLFilterIds[l]));
goto cleanup;
}
}
}
*psaNamesArg = psaNames;
*psaDataArg = psaData;
psaNames = NULL;
psaData = NULL;
cleanup:
if (bstrFilterId)
{
SysFreeString (bstrFilterId);
}
if (pObjGPO)
{
pObjGPO->Release();
}
if (pEnum)
{
pEnum->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
if (pWQLFilterIds) {
for (l=0; l < lCount; l++) {
if (pWQLFilterIds[l])
SysFreeString(pWQLFilterIds[l]);
}
LocalFree(pWQLFilterIds);
}
if (psaNames) {
SafeArrayDestroy(psaNames);
}
if (psaData) {
SafeArrayDestroy(psaData);
}
SysFreeString(strQueryLanguage);
SysFreeString(strQuery);
return hr;
}
VOID CRSOPComponentData::BuildWQLFilterList (HWND hDlg, BOOL bUser, SAFEARRAY **psaNames, SAFEARRAY **psaData)
{
HRESULT hr;
LPTSTR lpNameSpace, lpFullNameSpace, lpEnd;
TCHAR szBuffer[150];
HWND hLB = GetDlgItem (hDlg, IDC_LIST1);
ULONG ulErrorInfo;
//
// Prepare to generate the rsop data. Give the user a message in the listbox
// and disable the controls on the page
//
SetWaitCursor();
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
LoadString(g_hInstance, IDS_PLEASEWAIT, szBuffer, ARRAYSIZE(szBuffer));
SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) szBuffer);
PropSheet_SetWizButtons (GetParent(hDlg), 0);
EnableWindow (GetDlgItem(GetParent(hDlg), IDCANCEL), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
//
// Generate the rsop data using the info we have already
//
hr = GenerateRSOPData (NULL, &lpNameSpace, TRUE, TRUE, bUser, FALSE, &ulErrorInfo);
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
if (FAILED (hr))
{
ReportError (hDlg, hr, IDS_EXECFAILED);
goto Exit;
}
lpFullNameSpace = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpNameSpace) + 20) * sizeof(TCHAR));
if (lpFullNameSpace)
{
lstrcpy (lpFullNameSpace, lpNameSpace);
lpEnd = CheckSlash(lpFullNameSpace);
if (bUser)
{
lstrcpy (lpEnd, TEXT("User"));
}
else
{
lstrcpy (lpEnd, TEXT("Computer"));
}
if (SUCCEEDED(ExtractWQLFilters (lpFullNameSpace, psaNames, psaData)))
{
FillListFromSafeArrays (hLB, *psaNames, *psaData);
}
LocalFree (lpFullNameSpace);
}
DeleteRSOPData (lpNameSpace);
Exit:
PropSheet_SetWizButtons (GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
EnableWindow (GetDlgItem(GetParent(hDlg), IDCANCEL), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), TRUE);
ClearWaitCursor();
}
VOID CRSOPComponentData::FillListFromSafeArrays (HWND hLB, SAFEARRAY * psaNames, SAFEARRAY * psaData)
{
LONG lIndex, lMax;
INT iIndex;
LPTSTR lpText;
SetWaitCursor();
SendMessage (hLB, WM_SETREDRAW, FALSE, 0);
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
if (psaData)
{
if (SUCCEEDED(SafeArrayGetUBound (psaData, 1, &lMax)))
{
for (lIndex = 0; lIndex <= lMax; lIndex++)
{
if (SUCCEEDED(SafeArrayGetElement(psaNames, &lIndex, &lpText)))
{
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) lpText);
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::FillListFromSafeArrays: Added WQL filter %s"), lpText));
if (iIndex != LB_ERR)
{
if (SUCCEEDED(SafeArrayGetElement(psaData, &lIndex, &lpText)))
{
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) lpText);
}
}
}
}
}
}
SendMessage (hLB, LB_SETCURSEL, 0, 0);
SendMessage (hLB, WM_SETREDRAW, TRUE, 0);
UpdateWindow (hLB);
ClearWaitCursor();
}
VOID CRSOPComponentData::SaveWQLFilters (HWND hLB, SAFEARRAY **psaNamesArg, SAFEARRAY **psaDataArg)
{
SAFEARRAY * psaNames, *psaData;
SAFEARRAYBOUND rgsabound[1];
LONG i, lLength, lCount = (LONG) SendMessage (hLB, LB_GETCOUNT, 0, 0);
LPTSTR lpText, lpName;
BSTR bstrText;
HRESULT hr;
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lCount;
psaNames = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (!psaNames)
{
return;
}
psaData = SafeArrayCreate (VT_BSTR, 1, rgsabound);
if (!psaData)
{
SafeArrayDestroy (psaNames);
return;
}
for (i = 0; i < lCount; i++)
{
lLength = (LONG) SendMessage (hLB, LB_GETTEXTLEN, (WPARAM) i, 0);
lpName = new TCHAR [lLength + 1];
if (lpName)
{
if (SendMessage (hLB, LB_GETTEXT, (WPARAM) i, (LPARAM) lpName) != LB_ERR)
{
bstrText = SysAllocString (lpName);
if (bstrText)
{
hr = SafeArrayPutElement(psaNames, &i, bstrText);
if (SUCCEEDED(hr))
{
lpText = (LPTSTR) SendMessage (hLB, LB_GETITEMDATA, (WPARAM) i, 0);
if (lpText)
{
bstrText = SysAllocString (lpText);
if (bstrText)
{
hr = SafeArrayPutElement(psaData, &i, bstrText);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::SaveWQLFilters: SafeArrayPutElement failed with 0x%x."), hr));
}
}
}
}
}
}
delete [] lpName;
}
}
*psaNamesArg = psaNames;
*psaDataArg = psaData;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPWQLUserDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_BUTTON2:
{
INT iIndex;
iIndex = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iIndex != LB_ERR)
{
SendDlgItemMessage (hDlg, IDC_LIST1, LB_DELETESTRING, (WPARAM) iIndex, 0);
SendDlgItemMessage (hDlg, IDC_LIST1, LB_SETCURSEL, (WPARAM) iIndex, 0);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON1:
{
if (pCD->m_saUserWQLFilters)
{
SafeArrayDestroy (pCD->m_saUserWQLFilters);
pCD->m_saUserWQLFilters = NULL;
}
if (pCD->m_saUserWQLFilterNames)
{
SafeArrayDestroy (pCD->m_saUserWQLFilterNames);
pCD->m_saUserWQLFilterNames = NULL;
}
pCD->m_bSkipUserWQLFilter = FALSE;
if (pCD->m_saDefaultUserWQLFilters) {
pCD->FillListFromSafeArrays(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saDefaultUserWQLFilterNames, pCD->m_saDefaultUserWQLFilters);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
else {
PostMessage (hDlg, WM_BUILDWQLLIST, 0, 0);
}
}
break;
case IDC_RADIO2:
{
if (pCD->m_saUserWQLFilters)
{
SafeArrayDestroy (pCD->m_saUserWQLFilters);
pCD->m_saUserWQLFilters = NULL;
}
if (pCD->m_saUserWQLFilterNames)
{
SafeArrayDestroy (pCD->m_saUserWQLFilterNames);
pCD->m_saUserWQLFilterNames = NULL;
}
pCD->m_bSkipUserWQLFilter = TRUE;
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_RADIO3:
{
pCD->m_bSkipUserWQLFilter = FALSE;
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
}
}
break;
case WM_BUILDWQLLIST:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
pCD->BuildWQLFilterList (hDlg, TRUE, &pCD->m_saDefaultUserWQLFilterNames, &pCD->m_saDefaultUserWQLFilters);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD->m_bSkipUserWQLFilter) {
// set the listbox to null
pCD->FillListFromSafeArrays(GetDlgItem(hDlg, IDC_LIST1), NULL, NULL);
CheckDlgButton (hDlg, IDC_RADIO2, BST_CHECKED);
CheckDlgButton (hDlg, IDC_RADIO3, BST_UNCHECKED);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_LIST1), FALSE);
ShowWindow(GetDlgItem(hDlg, IDC_LIST2), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_HIDE);
}
else {
CheckDlgButton (hDlg, IDC_RADIO2, BST_UNCHECKED);
CheckDlgButton (hDlg, IDC_RADIO3, BST_CHECKED);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_LIST1), TRUE);
ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_LIST2), SW_HIDE);
if (SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCOUNT, 0, 0) > 0)
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
if (!(pCD->m_bSkipUserWQLFilter)) {
pCD->FillListFromSafeArrays(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saUserWQLFilterNames, pCD->m_saUserWQLFilters);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case PSN_WIZNEXT:
//
// Free the previous list of WQL Filters
//
if (pCD->m_saUserWQLFilters)
{
SafeArrayDestroy (pCD->m_saUserWQLFilters);
pCD->m_saUserWQLFilters = NULL;
}
if (pCD->m_saUserWQLFilterNames)
{
SafeArrayDestroy (pCD->m_saUserWQLFilterNames);
pCD->m_saUserWQLFilterNames = NULL;
}
//
// Save the current list
//
if (!pCD->m_bSkipUserWQLFilter) {
pCD->SaveWQLFilters (GetDlgItem(hDlg, IDC_LIST1), &pCD->m_saUserWQLFilterNames,
&pCD->m_saUserWQLFilters);
}
//
// Move to the next page
//
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
{
pCD->m_dwSkippedFrom = IDD_RSOP_WQLUSER;
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
if ((NULL == pCD->m_szComputerName) && (NULL == pCD->m_szComputerSOM))
{
// skip to the finish page
pCD->m_dwSkippedFrom = IDD_RSOP_WQLUSER;
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
}
pCD->m_dwSkippedFrom = 0;
break;
case PSN_WIZBACK:
if (!pCD->m_szComputerName && !pCD->m_szComputerSOM)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTUSERSEC);
return TRUE;
}
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPWQLCompDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (LOWORD(wParam))
{
case IDC_BUTTON2:
{
INT iIndex;
iIndex = (INT) SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0);
if (iIndex != LB_ERR)
{
SendDlgItemMessage (hDlg, IDC_LIST1, LB_DELETESTRING, (WPARAM) iIndex, 0);
SendDlgItemMessage (hDlg, IDC_LIST1, LB_SETCURSEL, (WPARAM) iIndex, 0);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_BUTTON1:
{
if (pCD->m_saComputerWQLFilters)
{
SafeArrayDestroy (pCD->m_saComputerWQLFilters);
pCD->m_saComputerWQLFilters = NULL;
}
if (pCD->m_saComputerWQLFilterNames)
{
SafeArrayDestroy (pCD->m_saComputerWQLFilterNames);
pCD->m_saComputerWQLFilterNames = NULL;
}
pCD->m_bSkipComputerWQLFilter = FALSE;
if (pCD->m_saDefaultComputerWQLFilters) {
pCD->FillListFromSafeArrays(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saDefaultComputerWQLFilterNames, pCD->m_saDefaultComputerWQLFilters);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
else {
PostMessage (hDlg, WM_BUILDWQLLIST, 0, 0);
}
}
break;
case IDC_RADIO2:
{
if (pCD->m_saComputerWQLFilters)
{
SafeArrayDestroy (pCD->m_saComputerWQLFilters);
pCD->m_saComputerWQLFilters = NULL;
}
if (pCD->m_saComputerWQLFilterNames)
{
SafeArrayDestroy (pCD->m_saComputerWQLFilterNames);
pCD->m_saComputerWQLFilterNames = NULL;
}
pCD->m_bSkipComputerWQLFilter = TRUE;
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case IDC_RADIO3:
{
pCD->m_bSkipComputerWQLFilter = FALSE;
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
}
}
break;
case WM_BUILDWQLLIST:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
pCD->BuildWQLFilterList (hDlg, FALSE, &pCD->m_saDefaultComputerWQLFilterNames, &pCD->m_saDefaultComputerWQLFilters);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD->m_bSkipComputerWQLFilter) {
// set the listbox to null
CheckDlgButton (hDlg, IDC_RADIO2, BST_CHECKED);
CheckDlgButton (hDlg, IDC_RADIO3, BST_UNCHECKED);
pCD->FillListFromSafeArrays(GetDlgItem(hDlg, IDC_LIST1), NULL, NULL);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_LIST1), FALSE);
ShowWindow(GetDlgItem(hDlg, IDC_LIST2), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_HIDE);
}
else {
CheckDlgButton (hDlg, IDC_RADIO2, BST_UNCHECKED);
CheckDlgButton (hDlg, IDC_RADIO3, BST_CHECKED);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
EnableWindow (GetDlgItem(hDlg, IDC_LIST1), TRUE);
ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_LIST2), SW_HIDE);
if (SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETCOUNT, 0, 0) > 0)
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
if (!(pCD->m_bSkipComputerWQLFilter)) {
pCD->FillListFromSafeArrays(GetDlgItem(hDlg, IDC_LIST1), pCD->m_saComputerWQLFilterNames, pCD->m_saComputerWQLFilters);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case PSN_WIZNEXT:
//
// Free the previous list of WQL Filters
//
if (pCD->m_saComputerWQLFilters)
{
SafeArrayDestroy (pCD->m_saComputerWQLFilters);
pCD->m_saComputerWQLFilters = NULL;
}
if (pCD->m_saComputerWQLFilterNames)
{
SafeArrayDestroy (pCD->m_saComputerWQLFilterNames);
pCD->m_saComputerWQLFilterNames = NULL;
}
//
// Save the current list
//
if (!pCD->m_bSkipComputerWQLFilter) {
pCD->SaveWQLFilters (GetDlgItem(hDlg, IDC_LIST1), &pCD->m_saComputerWQLFilterNames, &pCD->m_saComputerWQLFilters);
}
pCD->m_dwSkippedFrom = 0;
// skip to the last page in the wizard
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED3);
return TRUE;
case PSN_WIZBACK:
if (!pCD->m_szUserName && !pCD->m_szUserSOM)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTCOMPSEC);
return TRUE;
}
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPFinishedDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD)
{
pCD->InitializeResultsList (GetDlgItem (hDlg, IDC_LIST1));
}
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
if (pCD->m_bDiagnostic == FALSE)
{
UINT n;
n = (UINT) SendMessage(GetDlgItem(hDlg, IDC_EDIT1), WM_GETTEXTLENGTH, 0, 0);
if (n > 0 )
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
else
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
}
break;
case WM_COMMAND:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
if (pCD->m_bDiagnostic == FALSE)
{
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
if (DialogBoxParam (g_hInstance, MAKEINTRESOURCE(IDD_RSOP_BROWSEDC), hDlg,
BrowseDCDlgProc, (LPARAM) pCD))
{
SetDlgItemText (hDlg, IDC_EDIT1, pCD->m_szDC);
}
break;
case IDC_EDIT1:
if (HIWORD(wParam) == EN_CHANGE)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
}
}
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_WIZBACK:
if (pCD->m_bDiagnostic)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETUSER);
return TRUE;
}
if (pCD->m_dwSkippedFrom)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, pCD->m_dwSkippedFrom);
return TRUE;
}
if (!pCD->m_szComputerName && !pCD->m_szComputerSOM)
{
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLUSER);
return TRUE;
}
break;
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
if (pCD->m_bDiagnostic == FALSE)
{
if (pCD->m_szDC && pCD->IsComputerRSoPEnabled(pCD->m_szDC))
{
SetDlgItemText (hDlg, IDC_EDIT1, pCD->m_szDC);
}
else
{
SetDlgItemText (hDlg, IDC_EDIT1, TEXT(""));
}
}
pCD->FillResultsList (GetDlgItem (hDlg, IDC_LIST1));
break;
case PSN_WIZNEXT:
if (pCD->m_bDiagnostic == FALSE)
{
SetWaitCursor();
GetControlText(hDlg, IDC_EDIT1, pCD->m_szDC);
if (!pCD->IsComputerRSoPEnabled(pCD->m_szDC))
{
ClearWaitCursor();
ReportError(hDlg, GetLastError(), IDS_DCMISSINGRSOP);
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return TRUE;
}
ClearWaitCursor();
}
// PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_DISABLEDFINISH);
PropSheet_SetWizButtons (GetParent(hDlg), 0);
EnableWindow (GetDlgItem(GetParent(hDlg), IDCANCEL), FALSE);
if (FAILED(pCD->InitializeRSOP(hDlg)))
{
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK);
EnableWindow (GetDlgItem(GetParent(hDlg), IDCANCEL), TRUE);
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
return TRUE;
}
// skip to the VERY last page in the wizard
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED2);
return TRUE;
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPFinished2DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
SendMessage(GetDlgItem(hDlg, IDC_RSOP_BIG_BOLD1),
WM_SETFONT, (WPARAM)pCD->m_BigBoldFont, (LPARAM)TRUE);
/*
if (!pCD->m_hChooseBitmap)
{
pCD->m_hChooseBitmap = (HBITMAP) LoadImage (g_hInstance,
MAKEINTRESOURCE(IDB_WIZARD),
IMAGE_BITMAP, 0, 0,
LR_DEFAULTCOLOR);
}
if (pCD->m_hChooseBitmap)
{
SendDlgItemMessage (hDlg, IDC_BITMAP, STM_SETIMAGE,
IMAGE_BITMAP, (LPARAM) pCD->m_hChooseBitmap);
}
*/
break;
case WM_NOTIFY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (!pCD)
{
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons (GetParent(hDlg), PSWIZB_FINISH);
break;
case PSN_WIZFINISH:
// fall through
case PSN_RESET:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}
void CRSOPComponentData::InitializeResultsList (HWND hLV)
{
LV_COLUMN lvcol;
RECT rect;
TCHAR szTitle[50];
SendMessage(hLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
//
// Add the columns to the listview
//
GetClientRect(hLV, &rect);
ZeroMemory(&lvcol, sizeof(lvcol));
LoadString(g_hInstance, IDS_RSOP_DETAILS, szTitle, ARRAYSIZE(szTitle));
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
lvcol.pszText = szTitle;
lvcol.fmt = LVCFMT_LEFT;
lvcol.cx = (int)(rect.right * .40);
ListView_InsertColumn(hLV, 0, &lvcol);
LoadString(g_hInstance, IDS_RSOP_SETTINGS, szTitle, ARRAYSIZE(szTitle));
lvcol.cx = ((rect.right - lvcol.cx) - GetSystemMetrics(SM_CYHSCROLL));
lvcol.pszText = szTitle;
ListView_InsertColumn(hLV, 1, &lvcol);
}
void CRSOPComponentData::FillResultsList (HWND hLV)
{
TCHAR szTitle[200];
TCHAR szAccessDenied[75];
LPTSTR lpEnd;
LVITEM item;
INT iIndex = 0;
ULONG ulSize;
ListView_DeleteAllItems (hLV);
//
// Mode
//
ZeroMemory (&item, sizeof(item));
LoadString(g_hInstance, IDS_RSOP_FINISH_P0, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
if (m_bDiagnostic)
{
LoadString(g_hInstance, IDS_DIAGNOSTIC, szTitle, ARRAYSIZE(szTitle));
}
else
{
LoadString(g_hInstance, IDS_PLANNING, szTitle, ARRAYSIZE(szTitle));
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
if (m_bDiagnostic)
{
//
// User Name
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P1, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
if (m_szUserDisplayName)
{
lstrcpyn (szTitle, m_szUserDisplayName, ARRAYSIZE(szTitle));
}
else
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
}
if (m_bUserDeniedAccess)
{
LoadString(g_hInstance, IDS_ACCESSDENIED2, szAccessDenied, ARRAYSIZE(szAccessDenied));
if ((UINT)(ARRAYSIZE(szTitle) - lstrlen(szTitle)) > (UINT) lstrlen(szAccessDenied))
{
lstrcat (szTitle, szAccessDenied);
}
}
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
//
// Do not display user data
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P15, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
if (!m_bNoUserData)
{
LoadString(g_hInstance, IDS_YES, szTitle, ARRAYSIZE(szTitle));
}
else
{
LoadString(g_hInstance, IDS_NO, szTitle, ARRAYSIZE(szTitle));
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
//
// Computer Name
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P2, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
szTitle[0] = TEXT('\0');
if (!lstrcmpi(m_szComputerName, TEXT(".")))
{
ulSize = ARRAYSIZE(szTitle);
if (!GetComputerObjectName (NameSamCompatible, szTitle, &ulSize))
{
GetComputerNameEx (ComputerNameNetBIOS, szTitle, &ulSize);
}
}
else
{
lstrcpyn (szTitle, m_szComputerName, ARRAYSIZE(szTitle));
}
//
// Remove the trailing $
//
lpEnd = szTitle + lstrlen(szTitle) - 1;
if (*lpEnd == TEXT('$'))
{
*lpEnd = TEXT('\0');
}
if (m_bComputerDeniedAccess)
{
LoadString(g_hInstance, IDS_ACCESSDENIED2, szAccessDenied, ARRAYSIZE(szAccessDenied));
if ((UINT)(ARRAYSIZE(szTitle) - lstrlen(szTitle)) > (UINT)lstrlen(szAccessDenied))
{
lstrcat (szTitle, szAccessDenied);
}
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
//
// Do not display computer data
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P14, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
if (!m_bNoComputerData)
{
LoadString(g_hInstance, IDS_YES, szTitle, ARRAYSIZE(szTitle));
}
else
{
LoadString(g_hInstance, IDS_NO, szTitle, ARRAYSIZE(szTitle));
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
else
{
//
// User Name
//
ZeroMemory (&item, sizeof(item));
iIndex++;
if (!m_szUserName && m_szUserSOM)
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P9, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
lstrcpyn (szTitle, m_szUserSOM, ARRAYSIZE(szTitle));
if (m_bUserDeniedAccess)
{
LoadString(g_hInstance, IDS_ACCESSDENIED2, szAccessDenied, ARRAYSIZE(szAccessDenied));
if ((UINT)(ARRAYSIZE(szTitle) - lstrlen(szTitle)) > (UINT)lstrlen(szAccessDenied))
{
lstrcat (szTitle, szAccessDenied);
}
}
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
else
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P1, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
if (m_szUserName)
{
lstrcpyn (szTitle, m_szUserName, ARRAYSIZE(szTitle));
}
else
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
}
if (m_bUserDeniedAccess)
{
LoadString(g_hInstance, IDS_ACCESSDENIED2, szAccessDenied, ARRAYSIZE(szAccessDenied));
if ((UINT)(ARRAYSIZE(szTitle) - lstrlen(szTitle)) > (UINT)lstrlen(szAccessDenied))
{
lstrcat (szTitle, szAccessDenied);
}
}
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
//
// Computer Name
//
ZeroMemory (&item, sizeof(item));
iIndex++;
if (!m_szComputerName && m_szComputerSOM)
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P10, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
lstrcpyn (szTitle, m_szComputerSOM, ARRAYSIZE(szTitle));
if (m_bComputerDeniedAccess)
{
LoadString(g_hInstance, IDS_ACCESSDENIED2, szAccessDenied, ARRAYSIZE(szAccessDenied));
if ((UINT)(ARRAYSIZE(szTitle) - lstrlen(szTitle)) > (UINT)lstrlen(szAccessDenied))
{
lstrcat (szTitle, szAccessDenied);
}
}
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
else
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P2, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
if (m_szComputerName)
{
lstrcpyn (szTitle, m_szComputerName, ARRAYSIZE(szTitle));
lpEnd = szTitle + lstrlen(szTitle) - 1;
if (*lpEnd == TEXT('$'))
{
*lpEnd = TEXT('\0');
}
}
else
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
}
if (m_bComputerDeniedAccess)
{
LoadString(g_hInstance, IDS_ACCESSDENIED2, szAccessDenied, ARRAYSIZE(szAccessDenied));
if ((UINT)(ARRAYSIZE(szTitle) - lstrlen(szTitle)) > (UINT)lstrlen(szAccessDenied))
{
lstrcat (szTitle, szAccessDenied);
}
}
item.iItem = iIndex;
item.iSubItem = 1;
item.pszText = szTitle;
ListView_SetItem(hLV, &item);
}
}
//
// Show all GPOs
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P13, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
if (m_bSlowLink)
{
LoadString(g_hInstance, IDS_YES, szTitle, ARRAYSIZE(szTitle));
}
else
{
LoadString(g_hInstance, IDS_NO, szTitle, ARRAYSIZE(szTitle));
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
//
// Indicate the loopback mode
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P16, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
switch (m_loopbackMode)
{
case LoopbackNone:
LoadString(g_hInstance, IDS_NONE, szTitle, ARRAYSIZE(szTitle));
break;
case LoopbackReplace:
LoadString(g_hInstance, IDS_LOOPBACK_REPLACE, szTitle, ARRAYSIZE(szTitle));
break;
case LoopbackMerge:
LoadString(g_hInstance, IDS_LOOPBACK_MERGE, szTitle, ARRAYSIZE(szTitle));
break;
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
//
// Site Name
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P3, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
if (m_szSite)
{
item.pszText = m_szSite;
}
else
{
LoadString(g_hInstance, IDS_NONE, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
/*
//
// DC Name
//
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P4, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
item.pszText = m_szDC;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
*/
//
// Alternate User Location
//
if (m_szUserName)
{
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P5, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
if (m_szUserSOM)
{
item.pszText = m_szUserSOM;
}
else
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
//
// Alternate Computer Location
//
if (m_szComputerName)
{
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P6, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
item.mask = LVIF_TEXT;
if (m_szComputerSOM)
{
item.pszText = m_szComputerSOM;
}
else
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
//
// Alternate User security groups
//
if (m_szUserName || m_szUserSOM || LoopbackNone != m_loopbackMode)
{
if (m_saUserSecurityGroups)
{
LONG lIndex = 0, lMax;
LPTSTR lpText;
if (SUCCEEDED(SafeArrayGetUBound (m_saUserSecurityGroups, 1, &lMax)))
{
do {
if (SUCCEEDED(SafeArrayGetElement(m_saUserSecurityGroups, &lIndex, &lpText)))
{
ZeroMemory (&item, sizeof(item));
iIndex++;
item.mask = LVIF_TEXT;
item.iItem = iIndex;
if (lIndex == 0)
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P7, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
else
{
item.pszText = TEXT("");
}
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.pszText = lpText;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
lIndex++;
} while (lIndex <= (lMax + 1));
}
}
else
{
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P7, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
}
//
// Alternate Computer security groups
//
if (m_szComputerName || m_szComputerSOM)
{
if (m_saComputerSecurityGroups)
{
LONG lIndex = 0, lMax;
LPTSTR lpText;
if (SUCCEEDED(SafeArrayGetUBound (m_saComputerSecurityGroups, 1, &lMax)))
{
do {
if (SUCCEEDED(SafeArrayGetElement(m_saComputerSecurityGroups, &lIndex, &lpText)))
{
ZeroMemory (&item, sizeof(item));
iIndex++;
item.mask = LVIF_TEXT;
item.iItem = iIndex;
if (lIndex == 0)
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P8, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
else
{
item.pszText = TEXT("");
}
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
BOOL bDollarRemoved = FALSE;
if (lpText[wcslen(lpText)-1] == L'$')
{
bDollarRemoved = TRUE;
lpText[wcslen(lpText)-1] = 0;
}
item.pszText = lpText;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
if (bDollarRemoved) {
lpText[wcslen(lpText)] = L'$';
}
}
}
lIndex++;
} while (lIndex <= (lMax + 1));
}
}
else
{
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P8, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
}
//
// User WQL filters
//
if (m_szUserName || m_szUserSOM || LoopbackNone != m_loopbackMode)
{
LONG lFilterCount = 0;
if (m_saUserWQLFilterNames)
{
LONG lIndex = 0, lMax = 0;
LPTSTR lpText;
if (SUCCEEDED(SafeArrayGetUBound (m_saUserWQLFilterNames, 1, &lMax)))
{
do {
if (SUCCEEDED(SafeArrayGetElement(m_saUserWQLFilterNames, &lIndex, &lpText)))
{
lFilterCount++;
ZeroMemory (&item, sizeof(item));
iIndex++;
item.mask = LVIF_TEXT;
item.iItem = iIndex;
if (lIndex == 0)
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P11, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
else
{
item.pszText = TEXT("");
}
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.pszText = lpText;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
lIndex++;
} while (lIndex <= (lMax + 1));
}
}
if ((!m_saUserWQLFilterNames) || (lFilterCount == 0)) {
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P11, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
if (m_bSkipUserWQLFilter) {
LoadString(g_hInstance, IDS_SKIPWQLFILTER, szTitle, ARRAYSIZE(szTitle));
}
else {
LoadString(g_hInstance, IDS_NONESELECTED, szTitle, ARRAYSIZE(szTitle));
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
}
//
// Computer WQL filters
//
if (m_szComputerName || m_szComputerSOM)
{
LONG lFilterCount = 0;
if (m_saComputerWQLFilterNames)
{
LONG lIndex = 0, lMax = 0;
LPTSTR lpText;
if (SUCCEEDED(SafeArrayGetUBound (m_saComputerWQLFilterNames, 1, &lMax)))
{
do {
if (SUCCEEDED(SafeArrayGetElement(m_saComputerWQLFilterNames, &lIndex, &lpText)))
{
lFilterCount++;
ZeroMemory (&item, sizeof(item));
iIndex++;
item.mask = LVIF_TEXT;
item.iItem = iIndex;
if (lIndex == 0)
{
LoadString(g_hInstance, IDS_RSOP_FINISH_P12, szTitle, ARRAYSIZE(szTitle));
item.pszText = szTitle;
}
else
{
item.pszText = TEXT("");
}
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
LoadString(g_hInstance, IDS_NOTSPECIFIED, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.pszText = lpText;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
lIndex++;
} while (lIndex <= (lMax + 1));
}
}
if ((!m_saComputerWQLFilterNames) || (lFilterCount == 0)) {
ZeroMemory (&item, sizeof(item));
iIndex++;
LoadString(g_hInstance, IDS_RSOP_FINISH_P12, szTitle, ARRAYSIZE(szTitle));
item.mask = LVIF_TEXT;
item.iItem = iIndex;
item.pszText = szTitle;
iIndex = ListView_InsertItem (hLV, &item);
if (iIndex != -1)
{
if (m_bSkipComputerWQLFilter) {
LoadString(g_hInstance, IDS_SKIPWQLFILTER, szTitle, ARRAYSIZE(szTitle));
}
else {
LoadString(g_hInstance, IDS_NONESELECTED, szTitle, ARRAYSIZE(szTitle));
}
item.mask = LVIF_TEXT;
item.pszText = szTitle;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hLV, &item);
}
}
}
}
}
//
// CopyUnescapedSOM
//
// Purpose: to remove all escape sequence literals
// of the form \" from a SOM stored in WMI -- WMI
// cannot store the " character in a key field, so the
// only way to store the " is to escape it -- this is done
// so by preceding it with the \ char. To give back
// a friendly display to the user, we undo the escape process
//
void
CopyUnescapedSOM(
LPTSTR lpUnescapedSOM,
LPTSTR lpSOM )
{
while ( *lpSOM )
{
//
// If we have the escape character
//
if ( TEXT('\\') == *lpSOM )
{
//
// Check for the " character
//
if ( TEXT('"') == *(lpSOM + 1) )
{
//
// Skip the escape character if this is the " char
//
lpSOM++;
continue;
}
}
*lpUnescapedSOM++ = *lpSOM++;
}
*lpUnescapedSOM = TEXT('\0');
}
BOOL CRSOPComponentData::AddGPOListNode(LPTSTR lpGPOName, LPTSTR lpDSPath, LPTSTR lpSOM,
LPTSTR lpFiltering, DWORD dwVersion, BOOL bApplied,
LPBYTE pSD, DWORD dwSDSize, LPGPOLISTITEM *lpList)
{
DWORD dwSize;
LPGPOLISTITEM lpItem, lpTemp;
//
// Calculate the size of the new item
//
dwSize = sizeof (GPOLISTITEM);
dwSize += ((lstrlen(lpGPOName) + 1) * sizeof(TCHAR));
if (lpDSPath)
{
dwSize += ((lstrlen(lpDSPath) + 1) * sizeof(TCHAR));
}
dwSize += ((lstrlen(lpSOM) + 1) * sizeof(TCHAR));
dwSize += ((lstrlen(lpSOM) + 1) * sizeof(TCHAR)); // The unescaped SOM length -- it is always smaller than the actual SOM
dwSize += ((lstrlen(lpFiltering) + 1) * sizeof(TCHAR));
dwSize += dwSDSize + MAX_ALIGNMENT_SIZE;
//
// Allocate space for it
//
lpItem = (LPGPOLISTITEM) LocalAlloc (LPTR, dwSize);
if (!lpItem) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::AddGPOListNode: Failed to allocate memory with %d"),
GetLastError()));
return FALSE;
}
//
// Fill in item
//
lpItem->lpGPOName = (LPTSTR)(((LPBYTE)lpItem) + sizeof(GPOLISTITEM));
lstrcpy (lpItem->lpGPOName, lpGPOName);
if (lpDSPath)
{
lpItem->lpDSPath = lpItem->lpGPOName + lstrlen (lpItem->lpGPOName) + 1;
lstrcpy (lpItem->lpDSPath, lpDSPath);
lpItem->lpSOM = lpItem->lpDSPath + lstrlen (lpItem->lpDSPath) + 1;
lstrcpy (lpItem->lpSOM, lpSOM);
}
else
{
lpItem->lpSOM = lpItem->lpGPOName + lstrlen (lpItem->lpGPOName) + 1;
lstrcpy (lpItem->lpSOM, lpSOM);
}
//
// Note that the DS SOM's may contain characters such as '"' that
// must be escaped with a "\" in WMI -- thus the SOM name will contain
// '\' escape chars that are not actually present in the real SOM name,
// so we call a function that removes them
//
lpItem->lpUnescapedSOM = lpItem->lpSOM + lstrlen (lpItem->lpSOM) + 1;
CopyUnescapedSOM( lpItem->lpUnescapedSOM, lpItem->lpSOM );
lpItem->lpFiltering = lpItem->lpUnescapedSOM + lstrlen (lpItem->lpUnescapedSOM) + 1;
lstrcpy (lpItem->lpFiltering, lpFiltering);
if (pSD)
{
// sd has to be pointer aligned. This is currently aligning it to
// 8 byte boundary
DWORD dwOffset;
dwOffset = (DWORD) ((LPBYTE)(lpItem->lpFiltering + lstrlen (lpItem->lpFiltering) + 1) - (LPBYTE)lpItem);
lpItem->pSD = (LPBYTE)lpItem + ALIGN_SIZE_TO_NEXTPTR(dwOffset);
CopyMemory (lpItem->pSD, pSD, dwSDSize);
}
lpItem->dwVersion = dwVersion;
lpItem->bApplied = bApplied;
//
// Add item to the link list
//
if (*lpList)
{
lpTemp = *lpList;
while (lpTemp)
{
if (!lpTemp->pNext)
{
lpTemp->pNext = lpItem;
break;
}
lpTemp = lpTemp->pNext;
}
}
else
{
*lpList = lpItem;
}
return TRUE;
}
VOID CRSOPComponentData::FreeGPOListData(LPGPOLISTITEM lpList)
{
LPGPOLISTITEM lpTemp;
do {
lpTemp = lpList->pNext;
LocalFree (lpList);
lpList = lpTemp;
} while (lpTemp);
}
void CRSOPComponentData::BuildGPOList (LPGPOLISTITEM * lpList, LPTSTR lpNamespace)
{
HRESULT hr;
ULONG n, ulIndex = 0, ulOrder, ulAppliedOrder;
IWbemClassObject * pObjGPLink = NULL;
IWbemClassObject * pObjGPO = NULL;
IWbemClassObject * pObjSOM = NULL;
IEnumWbemClassObject * pAppliedEnum = NULL;
IEnumWbemClassObject * pNotAppliedEnum = NULL;
BSTR strQueryLanguage = SysAllocString(TEXT("WQL"));
BSTR strAppliedQuery = SysAllocString(TEXT("SELECT * FROM RSOP_GPLink where AppliedOrder > 0"));
BSTR strNotAppliedQuery = SysAllocString(TEXT("SELECT * FROM RSOP_GPLink where AppliedOrder = 0"));
BSTR strNamespace = SysAllocString(lpNamespace);
BSTR strTemp = NULL;
WCHAR * szGPOName = NULL;
WCHAR * szSOM = NULL;
WCHAR * szGPOPath = NULL;
WCHAR szFiltering[80] = {0};
BSTR bstrTemp = NULL;
ULONG ul = 0, ulVersion = 0;
BOOL bLinkEnabled, bGPOEnabled, bAccessDenied, bFilterAllowed, bSOMBlocked;
BOOL bProcessAppliedList = TRUE;
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
LV_COLUMN lvcol;
BOOL bValidGPOData;
LPBYTE pSD = NULL;
DWORD dwDataSize = 0;
//
// Get a locator instance
//
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *)&pLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: CoCreateInstance failed with 0x%x"), hr));
goto cleanup;
}
//
// Connect to the namespace
//
hr = pLocator->ConnectServer(lpNamespace,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: ConnectServer failed with 0x%x"), hr));
goto cleanup;
}
//
// Query for the RSOP_GPLink (applied) instances
//
hr = pNamespace->ExecQuery(strQueryLanguage,
strAppliedQuery,
WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pAppliedEnum);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: ExecQuery failed with 0x%x"), hr));
goto cleanup;
}
//
// Query for the RSOP_GPLink (notapplied) instances
//
hr = pNamespace->ExecQuery(strQueryLanguage,
strNotAppliedQuery,
WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pNotAppliedEnum);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: ExecQuery (notapplied) failed with 0x%x"), hr));
goto cleanup;
}
bProcessAppliedList = FALSE;
//
// Loop through the results
//
while (TRUE)
{
if (!bProcessAppliedList) {
//
// No need to sort the not applied list
//
hr = pNotAppliedEnum->Next(WBEM_INFINITE, 1, &pObjGPLink, &n);
if (FAILED(hr) || (n == 0))
{
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::BuildGPOList: Getting applied links")));
bProcessAppliedList = TRUE;
}
else {
hr = GetParameter(pObjGPLink, TEXT("AppliedOrder"), ulOrder);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get link order with 0x%x"), hr));
goto cleanup;
}
}
}
//
// Reset the enumerator so we can look through the results to find the
// correct index
//
if (bProcessAppliedList) {
pAppliedEnum->Reset();
//
// Find the correct index in the result set
//
ulIndex++;
ulOrder = 0;
do {
hr = pAppliedEnum->Next(WBEM_INFINITE, 1, &pObjGPLink, &n);
if (FAILED(hr) || (n == 0))
{
goto cleanup;
}
hr = GetParameter(pObjGPLink, TEXT("AppliedOrder"), ulOrder);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get link order with 0x%x"), hr));
goto cleanup;
}
if (ulOrder != ulIndex)
{
pObjGPLink->Release();
pObjGPLink = NULL;
}
} while (ulOrder != ulIndex);
if (FAILED(hr)) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Next failed with error 0x%x"), hr));
goto cleanup;
}
}
//
// Get the applied order of this link
//
hr = GetParameter(pObjGPLink, TEXT("AppliedOrder"), ulAppliedOrder);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get applied order with 0x%x"), hr));
goto cleanup;
}
//
// Get the enabled state of the link
//
hr = GetParameter(pObjGPLink, TEXT("enabled"), bLinkEnabled);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get enabled with 0x%x"), hr));
goto cleanup;
}
//
// Get the GPO path
//
hr = GetParameterBSTR(pObjGPLink, TEXT("GPO"), bstrTemp);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get GPO with 0x%x"), hr));
goto cleanup;
}
//
// Set the default GPO name to be the gpo path. Don't worry about
// freeing this string because the GetParameter call will free the buffer
// when the real name is successfully queried. Sometimes the rsop_gpo instance
// won't exist if this gpo is new.
//
szGPOName = new TCHAR[_tcslen(bstrTemp) + 1];
if (!szGPOName)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to allocate memory for temp gpo name.")));
goto cleanup;
}
if (CompareString (LOCALE_USER_DEFAULT, NORM_IGNORECASE | NORM_STOP_ON_NULL,
TEXT("RSOP_GPO.id="), 12, bstrTemp, 12) == CSTR_EQUAL)
{
// removing the first and last quote
lstrcpy (szGPOName, bstrTemp+13);
szGPOName[lstrlen(szGPOName)-1] = TEXT('\0');
}
else
{
lstrcpy (szGPOName, bstrTemp);
}
//
// Add ldap to the path if appropriate
//
if (lstrcmpi(szGPOName, TEXT("LocalGPO")))
{
szGPOPath = (LPTSTR) LocalAlloc (LPTR, (lstrlen(szGPOName) + 10) * sizeof(WCHAR));
if (!szGPOPath)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to allocate memory for full path with %d"),
GetLastError()));
goto cleanup;
}
lstrcpy (szGPOPath, TEXT("LDAP://"));
lstrcat (szGPOPath, szGPOName);
}
else
{
szGPOPath = NULL;
}
bValidGPOData = FALSE;
//
// Bind to the GPO
//
hr = pNamespace->GetObject(
bstrTemp,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pObjGPO,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: GetObject for GPO %s failed with 0x%x"),
bstrTemp, hr));
SysFreeString (bstrTemp);
bstrTemp = NULL;
goto GetSOMData;
}
SysFreeString (bstrTemp);
bstrTemp = NULL;
//
// Get the GPO name
//
hr = GetParameter(pObjGPO, TEXT("name"), szGPOName);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get name with 0x%x"), hr));
goto GetSOMData;
}
//
// Get the version number
//
hr = GetParameter(pObjGPO, TEXT("version"), ulVersion);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get version with 0x%x"), hr));
goto GetSOMData;
}
//
// Get the enabled state of the GPO
//
hr = GetParameter(pObjGPO, TEXT("enabled"), bGPOEnabled);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get gpo enabled state with 0x%x"), hr));
goto GetSOMData;
}
//
// Get the WMI filter state of the GPO
//
hr = GetParameter(pObjGPO, TEXT("filterAllowed"), bFilterAllowed);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get gpo enabled state with 0x%x"), hr));
goto GetSOMData;
}
//
// Check for access denied
//
hr = GetParameter(pObjGPO, TEXT("accessDenied"), bAccessDenied);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get accessdenied with 0x%x"), hr));
goto GetSOMData;
}
//
// Get the security descriptor
//
if (szGPOPath)
{
hr = GetParameterBytes(pObjGPO, TEXT("securityDescriptor"), &pSD, &dwDataSize);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get security descriptor with 0x%x"), hr));
goto GetSOMData;
}
}
bValidGPOData = TRUE;
GetSOMData:
//
// Get the SOM for this link (the S,D,OU that this GPO is linked to)
//
hr = GetParameterBSTR(pObjGPLink, TEXT("SOM"), bstrTemp);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get SOM with 0x%x"), hr));
goto AddNode;
}
//
// Bind to the SOM instance
//
hr = pNamespace->GetObject(
bstrTemp,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pObjSOM,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: GetObject for SOM of %s failed with 0x%x"),
bstrTemp, hr));
SysFreeString (bstrTemp);
bstrTemp = NULL;
goto AddNode;
}
SysFreeString (bstrTemp);
bstrTemp = NULL;
//
// Get SOM name
//
hr = GetParameter(pObjSOM, TEXT("id"), szSOM);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get som id with 0x%x"), hr));
goto AddNode;
}
//
// Get blocked from above
//
hr = GetParameter(pObjSOM, TEXT("blocked"), bSOMBlocked);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to get som id with 0x%x"), hr));
goto AddNode;
}
AddNode:
//
// Decide on the filtering name
//
if (ulAppliedOrder > 0)
{
LoadString(g_hInstance, IDS_APPLIED, szFiltering, ARRAYSIZE(szFiltering));
}
else if (!bLinkEnabled)
{
LoadString(g_hInstance, IDS_DISABLEDLINK, szFiltering, ARRAYSIZE(szFiltering));
}
else if (bSOMBlocked) {
LoadString(g_hInstance, IDS_BLOCKEDSOM, szFiltering, ARRAYSIZE(szFiltering));
}
else if ((bValidGPOData) && (!bGPOEnabled))
{
LoadString(g_hInstance, IDS_DISABLEDGPO, szFiltering, ARRAYSIZE(szFiltering));
}
else if ((bValidGPOData) && (bAccessDenied))
{
LoadString(g_hInstance, IDS_SECURITYDENIED, szFiltering, ARRAYSIZE(szFiltering));
}
else if ((bValidGPOData) && (!bFilterAllowed))
{
LoadString(g_hInstance, IDS_WMIFILTERFAILED, szFiltering, ARRAYSIZE(szFiltering));
}
else if ((bValidGPOData) && (ulVersion == 0))
{
LoadString(g_hInstance, IDS_NODATA, szFiltering, ARRAYSIZE(szFiltering));
}
else
{
LoadString(g_hInstance, IDS_UNKNOWNREASON, szFiltering, ARRAYSIZE(szFiltering));
}
if (!szSOM)
{
szSOM = new TCHAR[2];
if (!szSOM)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: Failed to allocate memory for temp som name.")));
goto cleanup;
}
szSOM[0] = TEXT(' ');
}
//
// Add this node to the list
//
if (!AddGPOListNode(szGPOName, szGPOPath, szSOM, szFiltering, ulVersion,
((ulAppliedOrder > 0) ? TRUE : FALSE), pSD, dwDataSize, lpList))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOList: AddGPOListNode failed.")));
}
//
// Prepare for next iteration
//
if (pObjSOM)
{
pObjSOM->Release();
pObjSOM = NULL;
}
if (pObjGPO)
{
pObjGPO->Release();
pObjGPO = NULL;
}
if (pObjGPLink)
{
pObjGPLink->Release();
pObjGPLink = NULL;
}
if (szGPOName)
{
delete [] szGPOName;
szGPOName = NULL;
}
if (szSOM)
{
delete [] szSOM;
szSOM = NULL;
}
if (szGPOPath)
{
LocalFree (szGPOPath);
szGPOPath = NULL;
}
if (pSD)
{
LocalFree (pSD);
pSD = NULL;
dwDataSize = 0;
}
ulVersion = 0;
}
cleanup:
if (szGPOPath)
{
LocalFree (szGPOPath);
}
if (pSD)
{
LocalFree (pSD);
}
if (szGPOName)
{
delete [] szGPOName;
}
if (szSOM)
{
delete [] szSOM;
}
if (pObjSOM)
{
pObjSOM->Release();
}
if (pObjGPO)
{
pObjGPO->Release();
}
if (pObjGPLink)
{
pObjGPLink->Release();
}
if (pAppliedEnum)
{
pAppliedEnum->Release();
}
if (pNotAppliedEnum)
{
pNotAppliedEnum->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
SysFreeString(strQueryLanguage);
SysFreeString(strAppliedQuery);
SysFreeString(strNotAppliedQuery);
SysFreeString(strNamespace);
}
void CRSOPComponentData::BuildGPOLists (void)
{
LPTSTR lpNamespace, lpEnd;
lpNamespace = (LPTSTR) LocalAlloc (LPTR, (lstrlen(m_szNamespace) + 20) * sizeof(TCHAR));
if (lpNamespace)
{
lstrcpy (lpNamespace, m_szNamespace);
lpEnd = CheckSlash(lpNamespace);
lstrcpy (lpEnd, TEXT("User"));
if (m_pUserGPOList)
{
FreeGPOListData(m_pUserGPOList);
m_pUserGPOList = NULL;
}
BuildGPOList (&m_pUserGPOList, lpNamespace);
lstrcpy (lpEnd, TEXT("Computer"));
if (m_pComputerGPOList)
{
FreeGPOListData(m_pComputerGPOList);
m_pComputerGPOList = NULL;
}
BuildGPOList (&m_pComputerGPOList, lpNamespace);
LocalFree (lpNamespace);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildGPOLists: Failed to allocate memory for namespace with %d"),
GetLastError()));
}
}
void CRSOPComponentData::PrepGPOList(HWND hList, BOOL bSOM, BOOL bFiltering,
BOOL bVersion, DWORD dwCount)
{
RECT rect;
WCHAR szHeading[256];
LV_COLUMN lvcol;
LONG lWidth;
INT cxName = 0, cxSOM = 0, cxFiltering = 0, cxVersion = 0, iTotal = 0;
INT iColIndex = 0;
//
// Delete any previous columns
//
SendMessage (hList, LVM_DELETECOLUMN, 3, 0);
SendMessage (hList, LVM_DELETECOLUMN, 2, 0);
SendMessage (hList, LVM_DELETECOLUMN, 1, 0);
SendMessage (hList, LVM_DELETECOLUMN, 0, 0);
//
// Decide on the column widths
//
GetClientRect(hList, &rect);
if (dwCount > (DWORD)ListView_GetCountPerPage(hList))
{
lWidth = (rect.right - rect.left) - GetSystemMetrics(SM_CYHSCROLL);
}
else
{
lWidth = rect.right - rect.left;
}
if (bFiltering)
{
cxFiltering = (lWidth * 30) / 100;
iTotal += cxFiltering;
}
if (bVersion)
{
cxVersion = (lWidth * 30) / 100;
iTotal += cxVersion;
}
if (bSOM)
{
cxSOM = (lWidth - iTotal) / 2;
iTotal += cxSOM;
cxName = lWidth - iTotal;
}
else
{
cxName = lWidth - iTotal;
}
//
// Insert the GPO Name column and then any appropriate columns
//
memset(&lvcol, 0, sizeof(lvcol));
lvcol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvcol.fmt = LVCFMT_LEFT;
lvcol.pszText = szHeading;
lvcol.cx = cxName;
LoadString(g_hInstance, IDS_GPO_NAME, szHeading, ARRAYSIZE(szHeading));
ListView_InsertColumn(hList, iColIndex, &lvcol);
iColIndex++;
if (bFiltering)
{
lvcol.cx = cxFiltering;
LoadString(g_hInstance, IDS_FILTERING, szHeading, ARRAYSIZE(szHeading));
ListView_InsertColumn(hList, iColIndex, &lvcol);
iColIndex++;
}
if (bSOM)
{
lvcol.cx = cxSOM;
LoadString(g_hInstance, IDS_SOM, szHeading, ARRAYSIZE(szHeading));
ListView_InsertColumn(hList, iColIndex, &lvcol);
iColIndex++;
}
if (bVersion)
{
lvcol.cx = cxVersion;
LoadString(g_hInstance, IDS_VERSION, szHeading, ARRAYSIZE(szHeading));
ListView_InsertColumn(hList, iColIndex, &lvcol);
}
//
// Turn on some listview features
//
SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
}
void CRSOPComponentData::FillGPOList(HWND hDlg, DWORD dwListID, LPGPOLISTITEM lpList,
BOOL bSOM, BOOL bFiltering, BOOL bVersion, BOOL bInitial)
{
LV_COLUMN lvcol;
HWND hList;
LV_ITEM item;
int iItem;
TCHAR szVersion[80];
TCHAR szVersionFormat[50];
INT iColIndex, iDefault = 0;
LPGPOLISTITEM lpItem, lpDefault = NULL;
DWORD dwCount = 0;
LVFINDINFO FindInfo;
LoadString(g_hInstance, IDS_VERSIONFORMAT, szVersionFormat, ARRAYSIZE(szVersionFormat));
hList = GetDlgItem(hDlg, dwListID);
ListView_DeleteAllItems(hList);
lpItem = lpList;
while (lpItem)
{
if (bInitial)
{
if (LOWORD(lpItem->dwVersion) != HIWORD(lpItem->dwVersion))
{
bVersion = TRUE;
CheckDlgButton (hDlg, IDC_CHECK3, BST_CHECKED);
}
}
lpItem = lpItem->pNext;
dwCount++;
}
PrepGPOList(hList, bSOM, bFiltering, bVersion, dwCount);
lpItem = lpList;
while (lpItem)
{
if (lpItem->bApplied || bFiltering)
{
wsprintf (szVersion, szVersionFormat, LOWORD(lpItem->dwVersion), HIWORD(lpItem->dwVersion));
iColIndex = 0;
memset(&item, 0, sizeof(item));
item.mask = LVIF_TEXT | LVIF_PARAM;
item.pszText = lpItem->lpGPOName;
item.iItem = 0;
item.lParam = (LPARAM) lpItem;
iItem = ListView_InsertItem(hList, &item);
iColIndex++;
if (bInitial)
{
if (LOWORD(lpItem->dwVersion) != HIWORD(lpItem->dwVersion))
{
lpDefault = lpItem;
}
}
if (bFiltering)
{
item.mask = LVIF_TEXT;
item.pszText = lpItem->lpFiltering;
item.iItem = iItem;
item.iSubItem = iColIndex;
ListView_SetItem(hList, &item);
iColIndex++;
}
if (bSOM)
{
item.mask = LVIF_TEXT;
item.pszText = lpItem->lpUnescapedSOM;
item.iItem = iItem;
item.iSubItem = iColIndex;
ListView_SetItem(hList, &item);
iColIndex++;
}
if (bVersion)
{
item.mask = LVIF_TEXT;
item.pszText = szVersion;
item.iItem = iItem;
item.iSubItem = iColIndex;
ListView_SetItem(hList, &item);
}
}
lpItem = lpItem->pNext;
}
if (lpDefault)
{
ZeroMemory (&FindInfo, sizeof(FindInfo));
FindInfo.flags = LVFI_PARAM;
FindInfo.lParam = (LPARAM) lpDefault;
iDefault = ListView_FindItem(hList, -1, &FindInfo);
if (iDefault == -1)
{
iDefault = 0;
}
}
//
// Select a item
//
item.mask = LVIF_STATE;
item.iItem = iDefault;
item.iSubItem = 0;
item.state = LVIS_SELECTED | LVIS_FOCUSED;
item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
SendMessage (hList, LVM_SETITEMSTATE, (WPARAM)iDefault, (LPARAM) &item);
SendMessage (hList, LVM_ENSUREVISIBLE, iDefault, FALSE);
}
void CRSOPComponentData::OnSecurity(HWND hDlg)
{
HWND hLV;
INT i;
HRESULT hr;
LVITEM item;
LPGPOLISTITEM lpItem;
TCHAR szGPOName[MAX_FRIENDLYNAME];
PROPSHEETHEADER psh;
HPROPSHEETPAGE hPages[2];
//
// Get the selected item (if any)
//
hLV = GetDlgItem (hDlg, IDC_LIST1);
i = ListView_GetNextItem(hLV, -1, LVNI_SELECTED);
if (i < 0)
{
return;
}
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = i;
item.pszText = szGPOName;
item.cchTextMax = ARRAYSIZE(szGPOName);
if (!ListView_GetItem (hLV, &item))
{
return;
}
lpItem = (LPGPOLISTITEM) item.lParam;
//
// Create the security page
//
hr = DSCreateSecurityPage (lpItem->lpDSPath, L"groupPolicyContainer",
DSSI_IS_ROOT | DSSI_READ_ONLY,
&hPages[0], ReadSecurityDescriptor,
WriteSecurityDescriptor, (LPARAM)lpItem);
if (FAILED(hr))
{
return;
}
//
// Display the property sheet
//
ZeroMemory (&psh, sizeof(psh));
psh.dwSize = sizeof(psh);
psh.dwFlags = PSH_PROPTITLE;
psh.hwndParent = hDlg;
psh.hInstance = g_hInstance;
psh.pszCaption = szGPOName;
psh.nPages = 1;
psh.phpage = hPages;
PropertySheet (&psh);
}
HRESULT WINAPI CRSOPComponentData::ReadSecurityDescriptor (LPCWSTR lpGPOPath,
SECURITY_INFORMATION si,
PSECURITY_DESCRIPTOR *pSD,
LPARAM lpContext)
{
LPGPOLISTITEM lpItem;
HRESULT hr;
lpItem = (LPGPOLISTITEM) lpContext;
if (!lpItem)
{
return E_FAIL;
}
if (si & DACL_SECURITY_INFORMATION)
{
*pSD = lpItem->pSD;
}
else
{
*pSD = NULL;
}
return S_OK;
}
HRESULT WINAPI CRSOPComponentData::WriteSecurityDescriptor (LPCWSTR lpGPOPath,
SECURITY_INFORMATION si,
PSECURITY_DESCRIPTOR pSD,
LPARAM lpContext)
{
return S_OK;
}
void CRSOPComponentData::OnEdit(HWND hDlg)
{
HWND hLV;
LVITEM item;
LPGPOLISTITEM lpItem;
INT i;
SHELLEXECUTEINFO ExecInfo;
TCHAR szArgs[MAX_PATH + 30];
//
// Get the selected item (if any)
//
hLV = GetDlgItem (hDlg, IDC_LIST1);
i = ListView_GetNextItem(hLV, -1, LVNI_SELECTED);
if (i < 0)
{
return;
}
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_PARAM;
item.iItem = i;
if (!ListView_GetItem (hLV, &item))
{
return;
}
lpItem = (LPGPOLISTITEM) item.lParam;
if (lpItem->lpDSPath)
{
if (!SpawnGPE(lpItem->lpDSPath, GPHintUnknown, NULL, hDlg))
{
ReportError (hDlg, GetLastError(), IDS_SPAWNGPEFAILED);
}
}
else
{
ZeroMemory (&ExecInfo, sizeof(ExecInfo));
ExecInfo.cbSize = sizeof(ExecInfo);
ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecInfo.lpVerb = TEXT("open");
ExecInfo.lpFile = TEXT("gpedit.msc");
ExecInfo.nShow = SW_SHOWNORMAL;
if (lstrcmpi(m_szComputerName, TEXT(".")))
{
wsprintf (szArgs, TEXT("/gpcomputer:\"%s\" /gphint:1"), m_szComputerName);
ExecInfo.lpParameters = szArgs;
}
if (ShellExecuteEx (&ExecInfo))
{
SetWaitCursor();
WaitForInputIdle (ExecInfo.hProcess, 10000);
ClearWaitCursor();
CloseHandle (ExecInfo.hProcess);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::OnEdit: ShellExecuteEx failed with %d"),
GetLastError()));
ReportError(NULL, GetLastError(), IDS_SPAWNGPEFAILED);
}
}
}
void CRSOPComponentData::OnContextMenu(HWND hDlg, LPARAM lParam)
{
LPGPOLISTITEM lpItem;
LVITEM item;
HMENU hPopup;
HWND hLV;
int i;
RECT rc;
POINT pt;
//
// Get the selected item (if any)
//
hLV = GetDlgItem (hDlg, IDC_LIST1);
i = ListView_GetNextItem(hLV, -1, LVNI_SELECTED);
if (i < 0)
{
return;
}
item.mask = LVIF_PARAM;
item.iItem = i;
item.iSubItem = 0;
if (!ListView_GetItem (GetDlgItem(hDlg, IDC_LIST1), &item))
{
return;
}
lpItem = (LPGPOLISTITEM) item.lParam;
//
// Figure out where to place the context menu
//
pt.x = ((int)(short)LOWORD(lParam));
pt.y = ((int)(short)HIWORD(lParam));
GetWindowRect (hLV, &rc);
if (!PtInRect (&rc, pt))
{
if ((lParam == (LPARAM) -1) && (i >= 0))
{
rc.left = LVIR_SELECTBOUNDS;
SendMessage (hLV, LVM_GETITEMRECT, i, (LPARAM) &rc);
pt.x = rc.left + 8;
pt.y = rc.top + ((rc.bottom - rc.top) / 2);
ClientToScreen (hLV, &pt);
}
else
{
pt.x = rc.left + ((rc.right - rc.left) / 2);
pt.y = rc.top + ((rc.bottom - rc.top) / 2);
}
}
//
// Load the context menu
//
hPopup = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDM_GPOLIST_CONTEXTMENU));
if (!hPopup) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::OnContextMenu: LoadMenu failed with %d"),
GetLastError()));
return;
}
if (!(lpItem->pSD)) {
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::OnContextMenu: Disabling Security menu item")));
EnableMenuItem(GetSubMenu(hPopup, 0), IDM_GPOLIST_SECURITY, MF_GRAYED);
DrawMenuBar(hDlg);
}
//
// Display the menu
//
TrackPopupMenu(GetSubMenu(hPopup, 0), TPM_LEFTALIGN, pt.x, pt.y, 0, hDlg, NULL);
DestroyMenu(hPopup);
}
void CRSOPComponentData::OnRefreshDisplay(HWND hDlg)
{
INT iIndex;
LVITEM item;
LPGPOLISTITEM lpItem;
iIndex = ListView_GetNextItem (GetDlgItem(hDlg, IDC_LIST1), -1,
LVNI_ALL | LVNI_SELECTED);
if (iIndex != -1)
{
item.mask = LVIF_PARAM;
item.iItem = iIndex;
item.iSubItem = 0;
if (!ListView_GetItem (GetDlgItem(hDlg, IDC_LIST1), &item))
{
return;
}
lpItem = (LPGPOLISTITEM) item.lParam;
if (lpItem->pSD)
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
}
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), TRUE);
}
else
{
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
}
}
INT_PTR CALLBACK CRSOPComponentData::QueryDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
WCHAR szBuffer[MAX_PATH];
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD)
{
pCD->InitializeResultsList (GetDlgItem(hDlg, IDC_LIST1));
pCD->FillResultsList (GetDlgItem(hDlg, IDC_LIST1));
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aQueryHelpIds);
break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aQueryHelpIds);
return (TRUE);
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPGPOListMachineProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
WCHAR szBuffer[MAX_PATH];
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
LoadString(g_hInstance, IDS_RSOP_GPOLIST_MACHINE, szBuffer, ARRAYSIZE(szBuffer));
SetDlgItemText(hDlg, IDC_STATIC1, szBuffer);
if (pCD)
{
pCD->FillGPOList(hDlg, IDC_LIST1, pCD->m_pComputerGPOList, FALSE, FALSE, FALSE, TRUE);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
switch (LOWORD(wParam))
{
case IDC_CHECK1:
case IDC_CHECK2:
case IDC_CHECK3:
{
pCD->FillGPOList(hDlg,
IDC_LIST1,
pCD->m_pComputerGPOList,
(BOOL) SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0),
(BOOL) SendMessage(GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0),
(BOOL) SendMessage(GetDlgItem(hDlg, IDC_CHECK3), BM_GETCHECK, 0, 0),
FALSE);
}
break;
case IDC_BUTTON2:
case IDM_GPOLIST_EDIT:
pCD->OnEdit(hDlg);
break;
case IDC_BUTTON1:
case IDM_GPOLIST_SECURITY:
pCD->OnSecurity(hDlg);
break;
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
}
break;
case WM_NOTIFY:
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
pCD->OnRefreshDisplay(hDlg);
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aGPOListHelpIds);
break;
case WM_CONTEXTMENU:
if (GetDlgItem(hDlg, IDC_LIST1) == (HWND)wParam)
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
pCD->OnContextMenu(hDlg, lParam);
}
}
else
{
// right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aGPOListHelpIds);
}
return TRUE;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPGPOListUserProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
WCHAR szBuffer[MAX_PATH];
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
LoadString(g_hInstance, IDS_RSOP_GPOLIST_USER, szBuffer, ARRAYSIZE(szBuffer));
SetDlgItemText(hDlg, IDC_STATIC1, szBuffer);
if (pCD)
{
pCD->FillGPOList(hDlg, IDC_LIST1, pCD->m_pUserGPOList, FALSE, FALSE, FALSE, TRUE);
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case WM_COMMAND:
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
switch (LOWORD(wParam))
{
case IDC_CHECK1:
case IDC_CHECK2:
case IDC_CHECK3:
{
pCD->FillGPOList(hDlg,
IDC_LIST1,
pCD->m_pUserGPOList,
(BOOL) SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0),
(BOOL) SendMessage(GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0),
(BOOL) SendMessage(GetDlgItem(hDlg, IDC_CHECK3), BM_GETCHECK, 0, 0),
FALSE);
}
break;
case IDC_BUTTON2:
case IDM_GPOLIST_EDIT:
pCD->OnEdit(hDlg);
break;
case IDC_BUTTON1:
case IDM_GPOLIST_SECURITY:
pCD->OnSecurity(hDlg);
break;
}
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
}
break;
case WM_NOTIFY:
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
pCD->OnRefreshDisplay(hDlg);
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aGPOListHelpIds);
break;
case WM_CONTEXTMENU:
if (GetDlgItem(hDlg, IDC_LIST1) == (HWND)wParam)
{
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
pCD->OnContextMenu(hDlg, lParam);
}
}
else
{
// right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aGPOListHelpIds);
}
return TRUE;
}
return FALSE;
}
void CRSOPComponentData::QueryRSoPPolicySettingStatusInstances (LPTSTR lpNamespace)
{
HRESULT hr;
ULONG n;
IWbemClassObject * pStatus = NULL;
IEnumWbemClassObject * pEnum = NULL;
BSTR strQueryLanguage = SysAllocString(TEXT("WQL"));
BSTR strQuery = SysAllocString(TEXT("SELECT * FROM RSoP_PolicySettingStatus"));
BSTR strNamespace = SysAllocString(lpNamespace);
BSTR bstrEventSource = NULL;
BSTR bstrEventLogName = NULL;
DWORD dwEventID;
BSTR bstrEventTime = NULL;
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
SYSTEMTIME EventTime, BeginTime, EndTime;
XBStr xbstrWbemTime;
FILETIME ft;
ULARGE_INTEGER ulTime;
//
// Get a locator instance
//
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *)&pLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: CoCreateInstance failed with 0x%x"), hr));
goto cleanup;
}
//
// Connect to the namespace
//
hr = pLocator->ConnectServer(lpNamespace,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: ConnectServer failed with 0x%x"), hr));
goto cleanup;
}
//
// Query for the RSoP_PolicySettingStatus instances
//
hr = pNamespace->ExecQuery(strQueryLanguage,
strQuery,
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnum);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: ExecQuery failed with 0x%x"), hr));
goto cleanup;
}
//
// Loop through the results
//
while (TRUE)
{
//
// Get 1 instance
//
hr = pEnum->Next(WBEM_INFINITE, 1, &pStatus, &n);
if (FAILED(hr) || (n == 0))
{
goto cleanup;
}
//
// Get the event source name
//
hr = GetParameterBSTR(pStatus, TEXT("eventSource"), bstrEventSource);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: Failed to get display name with 0x%x"), hr));
goto cleanup;
}
//
// Get the event log name
//
hr = GetParameterBSTR(pStatus, TEXT("eventLogName"), bstrEventLogName);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: Failed to get display name with 0x%x"), hr));
goto cleanup;
}
//
// Get the event ID
//
hr = GetParameter(pStatus, TEXT("eventID"), (ULONG)dwEventID);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: Failed to get display name with 0x%x"), hr));
goto cleanup;
}
//
// Get the EventTime in bstr format
//
hr = GetParameterBSTR(pStatus, TEXT("eventTime"), bstrEventTime);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: Failed to get event time with 0x%x"), hr));
goto cleanup;
}
//
// Convert it to system time format
//
xbstrWbemTime = bstrEventTime;
hr = WbemTimeToSystemTime(xbstrWbemTime, EventTime);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: WbemTimeToSystemTime failed with 0x%x"), hr));
goto cleanup;
}
//
// Take the event time minus 1 second to get the begin time
//
if (!SystemTimeToFileTime (&EventTime, &ft))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: SystemTimeToFileTime failed with %d"), GetLastError()));
goto cleanup;
}
ulTime.LowPart = ft.dwLowDateTime;
ulTime.HighPart = ft.dwHighDateTime;
ulTime.QuadPart = ulTime.QuadPart - 10000000; // 1 second
ft.dwLowDateTime = ulTime.LowPart;
ft.dwHighDateTime = ulTime.HighPart;
if (!FileTimeToSystemTime (&ft, &BeginTime))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: FileTimeToSystemTime failed with %d"), GetLastError()));
goto cleanup;
}
//
// Take the event time plus 1 second to get the end time
//
if (!SystemTimeToFileTime (&EventTime, &ft))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: SystemTimeToFileTime failed with %d"), GetLastError()));
goto cleanup;
}
ulTime.LowPart = ft.dwLowDateTime;
ulTime.HighPart = ft.dwHighDateTime;
ulTime.QuadPart = ulTime.QuadPart + 10000000; // 1 second
ft.dwLowDateTime = ulTime.LowPart;
ft.dwHighDateTime = ulTime.HighPart;
if (!FileTimeToSystemTime (&ft, &EndTime))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::QueryRSoPPolicySettingStatusInstances: FileTimeToSystemTime failed with %d"), GetLastError()));
goto cleanup;
}
//
// Get the event log source information
//
if (m_pEvents)
{
m_pEvents->QueryForEventLogEntries ((m_bDiagnostic ? m_szComputerName : m_szDC),
bstrEventLogName, bstrEventSource, dwEventID,
&BeginTime, &EndTime);
}
//
// Prepare for next iteration
//
SysFreeString (bstrEventSource);
bstrEventSource = NULL;
SysFreeString (bstrEventLogName);
bstrEventLogName = NULL;
SysFreeString (bstrEventTime);
bstrEventTime = NULL;
pStatus->Release();
pStatus = NULL;
}
cleanup:
if (bstrEventSource)
{
SysFreeString (bstrEventSource);
}
if (bstrEventLogName)
{
SysFreeString (bstrEventLogName);
}
if (bstrEventTime)
{
SysFreeString (bstrEventTime);
}
if (pEnum)
{
pEnum->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
SysFreeString(strQueryLanguage);
SysFreeString(strQuery);
SysFreeString(strNamespace);
}
void CRSOPComponentData::GetEventLogSources (IWbemServices * pNamespace,
LPTSTR lpCSEGUID, LPTSTR lpComputerName,
SYSTEMTIME *BeginTime, SYSTEMTIME *EndTime,
LPSOURCEENTRY *lpSources)
{
HRESULT hr;
ULONG n;
BSTR strQueryLanguage = SysAllocString(TEXT("WQL"));
BSTR strQuery = NULL;
LPTSTR lpQuery;
const TCHAR szBaseQuery [] = TEXT("SELECT * FROM RSOP_ExtensionEventSourceLink WHERE extensionStatus=\"RSOP_ExtensionStatus.extensionGuid=\\\"%s\\\"\"");
IEnumWbemClassObject * pEnum = NULL;
IWbemClassObject * pLink = NULL;
IWbemClassObject * pEventSource = NULL;
BSTR bstrEventSource = NULL;
BSTR bstrEventLogName = NULL;
BSTR bstrEventSourceName = NULL;
//
// Build the query first
//
lpQuery = (LPTSTR) LocalAlloc (LPTR, (lstrlen(szBaseQuery) + 50) * sizeof(TCHAR));
if (!lpQuery)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: Failed to allocate memory for query")));
goto cleanup;
}
wsprintf (lpQuery, szBaseQuery, lpCSEGUID);
strQuery = SysAllocString(lpQuery);
LocalFree (lpQuery);
if (!strQuery)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: Failed to allocate memory for query (2)")));
goto cleanup;
}
//
// Query for the RSOP_ExtensionEventSourceLink instances that match this CSE
//
hr = pNamespace->ExecQuery(strQueryLanguage,
strQuery,
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnum);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: ExecQuery failed with 0x%x"), hr));
goto cleanup;
}
//
// Loop through the results
//
while (TRUE)
{
//
// Get 1 instance
//
hr = pEnum->Next(WBEM_INFINITE, 1, &pLink, &n);
if (FAILED(hr) || (n == 0))
{
goto cleanup;
}
//
// Get the eventSource reference
//
hr = GetParameterBSTR(pLink, TEXT("eventSource"), bstrEventSource);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: Failed to get event source reference with 0x%x"), hr));
goto cleanup;
}
//
// Get the eventSource instance
//
hr = pNamespace->GetObject(
bstrEventSource,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pEventSource,
NULL);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: GetObject for event source of %s failed with 0x%x"),
bstrEventSource, hr));
goto loopagain;
}
//
// Get the eventLogSource property
//
hr = GetParameterBSTR(pEventSource, TEXT("eventLogSource"), bstrEventSourceName);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: Failed to get event source name with 0x%x"), hr));
goto cleanup;
}
//
// Get the eventLogName property
//
hr = GetParameterBSTR(pEventSource, TEXT("eventLogName"), bstrEventLogName);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetEventLogSources: Failed to get event log name with 0x%x"), hr));
goto cleanup;
}
if (m_pEvents)
{
//
// Add it to the list of sources
//
m_pEvents->AddSourceEntry (bstrEventLogName, bstrEventSourceName, lpSources);
//
// Initialize the event log database for this source if we are working
// with a live query. If this is archived data, the event log entries
// will be reloaded from the saved console file.
//
if (!m_bArchiveData)
{
m_pEvents->QueryForEventLogEntries (lpComputerName,
bstrEventLogName, bstrEventSourceName,
0, BeginTime, EndTime);
}
}
//
// Clean up for next item
//
SysFreeString (bstrEventLogName);
bstrEventLogName = NULL;
SysFreeString (bstrEventSourceName);
bstrEventSourceName = NULL;
pEventSource->Release();
pEventSource = NULL;
loopagain:
SysFreeString (bstrEventSource);
bstrEventSource = NULL;
pLink->Release();
pLink = NULL;
}
cleanup:
if (bstrEventSourceName)
{
SysFreeString (bstrEventSourceName);
}
if (bstrEventLogName)
{
SysFreeString (bstrEventLogName);
}
if (bstrEventSource)
{
SysFreeString (bstrEventSource);
}
if (pEventSource)
{
pEventSource->Release();
}
if (pLink)
{
pLink->Release();
}
if (pEnum)
{
pEnum->Release();
}
if (strQueryLanguage)
{
SysFreeString(strQueryLanguage);
}
if (strQuery)
{
SysFreeString(strQuery);
}
}
void CRSOPComponentData::BuildCSEList (LPCSEITEM * lpList, LPTSTR lpNamespace, BOOL *bCSEError, BOOL *bGPCoreError)
{
HRESULT hr;
ULONG n;
IWbemClassObject * pExtension = NULL;
IEnumWbemClassObject * pEnum = NULL;
BSTR strQueryLanguage = SysAllocString(TEXT("WQL"));
BSTR strQuery = SysAllocString(TEXT("SELECT * FROM RSOP_ExtensionStatus"));
BSTR strNamespace = SysAllocString(lpNamespace);
BSTR bstrName = NULL;
BSTR bstrGUID = NULL;
BSTR bstrBeginTime = NULL;
BSTR bstrEndTime = NULL;
ULONG ulLoggingStatus;
ULONG ulStatus;
IWbemLocator * pLocator = NULL;
IWbemServices * pNamespace = NULL;
SYSTEMTIME BeginTime, EndTime;
LPTSTR lpSourceNames = NULL;
XBStr xbstrWbemTime;
LPSOURCEENTRY lpSources;
//
// Get a locator instance
//
hr = CoCreateInstance(CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *)&pLocator);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: CoCreateInstance failed with 0x%x"), hr));
goto cleanup;
}
//
// Connect to the namespace
//
hr = pLocator->ConnectServer(lpNamespace,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
&pNamespace);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: ConnectServer failed with 0x%x"), hr));
goto cleanup;
}
//
// Query for the RSOP_ExtensionStatus instances
//
hr = pNamespace->ExecQuery(strQueryLanguage,
strQuery,
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnum);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: ExecQuery failed with 0x%x"), hr));
goto cleanup;
}
//
// Loop through the results
//
while (TRUE)
{
//
// Get 1 instance
//
hr = pEnum->Next(WBEM_INFINITE, 1, &pExtension, &n);
if (FAILED(hr) || (n == 0))
{
goto cleanup;
}
//
// Get the name
//
hr = GetParameterBSTR(pExtension, TEXT("displayName"), bstrName);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: Failed to get display name with 0x%x"), hr));
goto cleanup;
}
//
// Get the GUID
//
hr = GetParameterBSTR(pExtension, TEXT("extensionGuid"), bstrGUID);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: Failed to get display name with 0x%x"), hr));
goto cleanup;
}
//
// Get the status
//
hr = GetParameter(pExtension, TEXT("error"), ulStatus);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: Failed to get status with 0x%x"), hr));
goto cleanup;
}
//
// Get the rsop logging status
//
hr = GetParameter(pExtension, TEXT("loggingStatus"), ulLoggingStatus);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: Failed to get logging status with 0x%x"), hr));
goto cleanup;
}
//
// Get the BeginTime in bstr format
//
hr = GetParameterBSTR(pExtension, TEXT("beginTime"), bstrBeginTime);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: Failed to get begin time with 0x%x"), hr));
goto cleanup;
}
//
// Convert it to system time format
//
xbstrWbemTime = bstrBeginTime;
hr = WbemTimeToSystemTime(xbstrWbemTime, BeginTime);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: WbemTimeToSystemTime failed with 0x%x"), hr));
goto cleanup;
}
//
// Get the EndTime in bstr format
//
hr = GetParameterBSTR(pExtension, TEXT("endTime"), bstrEndTime);
if (SUCCEEDED(hr))
{
//
// Convert it to system time format
//
xbstrWbemTime = bstrEndTime;
hr = WbemTimeToSystemTime(xbstrWbemTime, EndTime);
if (FAILED(hr))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: WbemTimeToSystemTime failed with 0x%x"), hr));
goto cleanup;
}
}
else
{
FILETIME ft;
ULARGE_INTEGER ulTime;
//
// Add 2 minutes to BeginTime to get a close approx of the EndTime
//
if (!SystemTimeToFileTime (&BeginTime, &ft))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: SystemTimeToFileTime failed with %d"), GetLastError()));
goto cleanup;
}
ulTime.LowPart = ft.dwLowDateTime;
ulTime.HighPart = ft.dwHighDateTime;
ulTime.QuadPart = ulTime.QuadPart + (10000000 * 120); // 120 seconds
ft.dwLowDateTime = ulTime.LowPart;
ft.dwHighDateTime = ulTime.HighPart;
if (!FileTimeToSystemTime (&ft, &EndTime))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: FileTimeToSystemTime failed with %d"), GetLastError()));
goto cleanup;
}
}
//
// Get the event log source information
//
lpSources = NULL;
GetEventLogSources (pNamespace, bstrGUID, (m_bDiagnostic ? m_szComputerName : m_szDC),
&BeginTime, &EndTime, &lpSources);
//
// Add this node to the list
//
if (!AddCSENode(bstrName, bstrGUID, ulStatus, ulLoggingStatus, &BeginTime, &EndTime,
lpList, bCSEError, bGPCoreError, lpSources))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSEList: AddGPOListNode failed.")));
if (m_pEvents)
{
m_pEvents->FreeSourceData (lpSources);
}
goto cleanup;
}
//
// Prepare for next iteration
//
SysFreeString (bstrName);
bstrName = NULL;
SysFreeString (bstrGUID);
bstrGUID = NULL;
SysFreeString (bstrBeginTime);
bstrBeginTime = NULL;
if (bstrEndTime)
{
SysFreeString (bstrEndTime);
bstrEndTime = NULL;
}
LocalFree (lpSourceNames);
lpSourceNames = NULL;
pExtension->Release();
pExtension = NULL;
}
cleanup:
if (bstrName)
{
SysFreeString (bstrName);
}
if (bstrGUID)
{
SysFreeString (bstrGUID);
}
if (bstrBeginTime)
{
SysFreeString (bstrBeginTime);
}
if (bstrEndTime)
{
SysFreeString (bstrEndTime);
}
if (lpSourceNames)
{
LocalFree (lpSourceNames);
}
if (pEnum)
{
pEnum->Release();
}
if (pNamespace)
{
pNamespace->Release();
}
if (pLocator)
{
pLocator->Release();
}
SysFreeString(strQueryLanguage);
SysFreeString(strQuery);
SysFreeString(strNamespace);
}
VOID CRSOPComponentData::BuildCSELists (void)
{
LPTSTR lpNamespace, lpEnd;
lpNamespace = (LPTSTR) LocalAlloc (LPTR, (lstrlen(m_szNamespace) + 20) * sizeof(TCHAR));
if (lpNamespace)
{
lstrcpy (lpNamespace, m_szNamespace);
lpEnd = CheckSlash(lpNamespace);
lstrcpy (lpEnd, TEXT("User"));
if (m_pUserCSEList)
{
FreeCSEData(m_pUserCSEList);
m_pUserCSEList = NULL;
}
BuildCSEList (&m_pUserCSEList, lpNamespace, &m_bUserCSEError, &m_bUserGPCoreError);
if (!m_bArchiveData)
{
QueryRSoPPolicySettingStatusInstances (lpNamespace);
}
lstrcpy (lpEnd, TEXT("Computer"));
if (m_pComputerCSEList)
{
FreeCSEData(m_pComputerCSEList);
m_pComputerCSEList = NULL;
}
BuildCSEList (&m_pComputerCSEList, lpNamespace, &m_bComputerCSEError, &m_bComputerGPCoreError);
if (!m_bArchiveData)
{
QueryRSoPPolicySettingStatusInstances (lpNamespace);
}
LocalFree (lpNamespace);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildCSELists: Failed to allocate memory for namespace with %d"),
GetLastError()));
}
}
BOOL CRSOPComponentData::AddCSENode(LPTSTR lpName, LPTSTR lpGUID, DWORD dwStatus,
ULONG ulLoggingStatus, SYSTEMTIME *pBeginTime, SYSTEMTIME *pEndTime,
LPCSEITEM *lpList, BOOL *bCSEError, BOOL *bGPCoreError,
LPSOURCEENTRY lpSources)
{
DWORD dwSize;
LPCSEITEM lpItem, lpTemp;
GUID guid;
//
// Calculate the size of the new item
//
dwSize = sizeof (CSEITEM);
dwSize += ((lstrlen(lpName) + 1) * sizeof(TCHAR));
dwSize += ((lstrlen(lpGUID) + 1) * sizeof(TCHAR));
//
// Allocate space for it
//
lpItem = (LPCSEITEM) LocalAlloc (LPTR, dwSize);
if (!lpItem) {
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::AddCSENode: Failed to allocate memory with %d"),
GetLastError()));
return FALSE;
}
//
// Fill in item
//
lpItem->lpName = (LPTSTR)(((LPBYTE)lpItem) + sizeof(CSEITEM));
lstrcpy (lpItem->lpName, lpName);
lpItem->lpGUID = lpItem->lpName + lstrlen (lpItem->lpName) + 1;
lstrcpy (lpItem->lpGUID, lpGUID);
lpItem->dwStatus = dwStatus;
lpItem->ulLoggingStatus = ulLoggingStatus;
lpItem->lpEventSources = lpSources;
CopyMemory ((LPBYTE)&lpItem->BeginTime, pBeginTime, sizeof(SYSTEMTIME));
CopyMemory ((LPBYTE)&lpItem->EndTime, pEndTime, sizeof(SYSTEMTIME));
//
// Add item to the link list
//
if (*lpList)
{
StringToGuid( lpGUID, &guid);
if (IsNullGUID (&guid))
{
lpItem->pNext = *lpList;
*lpList = lpItem;
}
else
{
lpTemp = *lpList;
while (lpTemp)
{
if (!lpTemp->pNext)
{
lpTemp->pNext = lpItem;
break;
}
lpTemp = lpTemp->pNext;
}
}
}
else
{
*lpList = lpItem;
}
//
// Set the error flag if appropriate
//
if ((dwStatus != ERROR_SUCCESS) || (ulLoggingStatus == 2))
{
StringToGuid( lpGUID, &guid);
if (IsNullGUID (&guid))
{
*bGPCoreError = TRUE;
}
else
{
*bCSEError = TRUE;
}
}
return TRUE;
}
VOID CRSOPComponentData::FreeCSEData(LPCSEITEM lpList)
{
LPCSEITEM lpTemp;
do {
lpTemp = lpList->pNext;
if (m_pEvents)
{
m_pEvents->FreeSourceData (lpList->lpEventSources);
}
LocalFree (lpList);
lpList = lpTemp;
} while (lpTemp);
}
void CRSOPComponentData::InitializeErrorsDialog(HWND hDlg, LPCSEITEM lpList)
{
RECT rect;
WCHAR szBuffer[256];
LV_COLUMN lvcol;
LONG lWidth;
INT cxName = 0, cxStatus = 0, iIndex = 0, iDefault = 0;
DWORD dwCount = 0;
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
LPCSEITEM lpTemp;
LVITEM item;
GUID guid;
BOOL bGPCoreFailed = FALSE;
//
// Count the number of components
//
lpTemp = lpList;
while (lpTemp)
{
lpTemp = lpTemp->pNext;
dwCount++;
}
//
// Decide on the column widths
//
GetClientRect(hList, &rect);
if (dwCount > (DWORD)ListView_GetCountPerPage(hList))
{
lWidth = (rect.right - rect.left) - GetSystemMetrics(SM_CYHSCROLL);
}
else
{
lWidth = rect.right - rect.left;
}
cxStatus = (lWidth * 35) / 100;
cxName = lWidth - cxStatus;
//
// Insert the component name column and then the status column
//
memset(&lvcol, 0, sizeof(lvcol));
lvcol.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvcol.fmt = LVCFMT_LEFT;
lvcol.pszText = szBuffer;
lvcol.cx = cxName;
LoadString(g_hInstance, IDS_COMPONENT_NAME, szBuffer, ARRAYSIZE(szBuffer));
ListView_InsertColumn(hList, 0, &lvcol);
lvcol.cx = cxStatus;
LoadString(g_hInstance, IDS_STATUS, szBuffer, ARRAYSIZE(szBuffer));
ListView_InsertColumn(hList, 1, &lvcol);
//
// Turn on some listview features
//
SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
//
// Insert the CSE's
//
lpTemp = lpList;
while (lpTemp)
{
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = iIndex;
item.pszText = lpTemp->lpName;
item.lParam = (LPARAM) lpTemp;
iIndex = ListView_InsertItem (hList, &item);
if (bGPCoreFailed)
{
LoadString(g_hInstance, IDS_CSE_NA, szBuffer, ARRAYSIZE(szBuffer));
}
else if ((lpTemp->dwStatus == ERROR_SUCCESS) && (lpTemp->ulLoggingStatus != 2))
{
if (lpTemp->ulLoggingStatus == 3)
{
LoadString(g_hInstance, IDS_SUCCESS2, szBuffer, ARRAYSIZE(szBuffer));
}
else
{
LoadString(g_hInstance, IDS_SUCCESS, szBuffer, ARRAYSIZE(szBuffer));
}
}
else if (lpTemp->dwStatus == E_PENDING)
{
LoadString(g_hInstance, IDS_PENDING, szBuffer, ARRAYSIZE(szBuffer));
}
else if (lpTemp->dwStatus == ERROR_OVERRIDE_NOCHANGES)
{
LoadString(g_hInstance, IDS_WARNING, szBuffer, ARRAYSIZE(szBuffer));
}
else
{
if (lpTemp->ulLoggingStatus == 3)
{
LoadString(g_hInstance, IDS_FAILED2, szBuffer, ARRAYSIZE(szBuffer));
}
else
{
LoadString(g_hInstance, IDS_FAILED, szBuffer, ARRAYSIZE(szBuffer));
}
}
item.mask = LVIF_TEXT;
item.pszText = szBuffer;
item.iItem = iIndex;
item.iSubItem = 1;
ListView_SetItem(hList, &item);
//
// Check if GPCore failed
//
StringToGuid( lpTemp->lpGUID, &guid);
if (IsNullGUID (&guid))
{
if (lpTemp->dwStatus != ERROR_SUCCESS)
{
bGPCoreFailed = TRUE;
}
}
lpTemp = lpTemp->pNext;
iIndex++;
}
//
// Select the first non-successful item
//
iIndex = 0;
while (iIndex < ListView_GetItemCount(hList))
{
ZeroMemory (&item, sizeof(item));
item.mask = LVIF_PARAM;
item.iItem = iIndex;
if (!ListView_GetItem (hList, &item))
{
break;
}
if (item.lParam)
{
lpTemp = (LPCSEITEM) item.lParam;
if ((lpTemp->dwStatus != ERROR_SUCCESS) || (lpTemp->ulLoggingStatus == 2))
{
iDefault = iIndex;
break;
}
}
iIndex++;
}
item.mask = LVIF_STATE;
item.iItem = iDefault;
item.iSubItem = 0;
item.state = LVIS_SELECTED | LVIS_FOCUSED;
item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
SendMessage (hList, LVM_SETITEMSTATE, iDefault, (LPARAM) &item);
SendMessage (hList, LVM_ENSUREVISIBLE, iDefault, FALSE);
}
void CRSOPComponentData::RefreshErrorInfo (HWND hDlg)
{
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
HWND hEdit = GetDlgItem(hDlg, IDC_EDIT1);
LPCSEITEM lpItem;
LVITEM item;
INT iIndex;
TCHAR szBuffer[300];
LPTSTR lpMsg;
TCHAR szDate[100];
TCHAR szTime[100];
TCHAR szFormat[80];
FILETIME ft, ftLocal;
SYSTEMTIME systime;
LPOLESTR lpEventLogText = NULL;
CHARFORMAT2 chFormat;
BOOL bBold = FALSE;
GUID guid;
iIndex = ListView_GetNextItem (hList, -1, LVNI_ALL | LVNI_SELECTED);
if (iIndex != -1)
{
//
// Get the CSEITEM pointer
//
item.mask = LVIF_PARAM;
item.iItem = iIndex;
item.iSubItem = 0;
if (!ListView_GetItem (hList, &item))
{
return;
}
lpItem = (LPCSEITEM) item.lParam;
if (!lpItem)
{
return;
}
SendMessage (hEdit, WM_SETREDRAW, FALSE, 0);
//
// Set the time information
//
SendMessage (hEdit, EM_SETSEL, 0, (LPARAM) -1);
SystemTimeToFileTime (&lpItem->EndTime, &ft);
FileTimeToLocalFileTime (&ft, &ftLocal);
FileTimeToSystemTime (&ftLocal, &systime);
GetDateFormat (LOCALE_USER_DEFAULT, DATE_LONGDATE, &systime,
NULL, szDate, ARRAYSIZE (szDate));
GetTimeFormat (LOCALE_USER_DEFAULT, 0, &systime,
NULL, szTime, ARRAYSIZE (szTime));
LoadString (g_hInstance, IDS_DATETIMEFORMAT, szFormat, ARRAYSIZE(szFormat));
wsprintf (szBuffer, szFormat, szDate, szTime);
//
// Turn italic on
//
ZeroMemory (&chFormat, sizeof(chFormat));
chFormat.cbSize = sizeof(chFormat);
chFormat.dwMask = CFM_ITALIC;
chFormat.dwEffects = CFE_ITALIC;
SendMessage (hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
(LPARAM) &chFormat);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) szBuffer);
if (lpItem->ulLoggingStatus == 3)
{
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) TEXT("\r\n\r\n"));
LoadString(g_hInstance, IDS_LEGACYCSE, szBuffer, ARRAYSIZE(szBuffer));
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) szBuffer);
LoadString(g_hInstance, IDS_LEGACYCSE1, szBuffer, ARRAYSIZE(szBuffer));
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) szBuffer);
}
//
// Turn italic off
//
ZeroMemory (&chFormat, sizeof(chFormat));
chFormat.cbSize = sizeof(chFormat);
chFormat.dwMask = CFM_ITALIC;
SendMessage (hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
(LPARAM) &chFormat);
//
// Put a blank line in between the time and the main message
//
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) TEXT("\r\n\r\n"));
//
// Set the main message
//
if (lpItem->ulLoggingStatus == 2)
{
if ( lpItem->dwStatus == ERROR_SUCCESS )
LoadString(g_hInstance, IDS_LOGGINGFAILED, szBuffer, ARRAYSIZE(szBuffer));
else
LoadString(g_hInstance, IDS_FAILEDMSG2, szBuffer, ARRAYSIZE(szBuffer));
bBold = TRUE;
}
else if (lpItem->dwStatus == ERROR_SUCCESS)
{
LoadString(g_hInstance, IDS_SUCCESSMSG, szBuffer, ARRAYSIZE(szBuffer));
}
else if (lpItem->dwStatus == E_PENDING)
{
LoadString(g_hInstance, IDS_PENDINGMSG, szBuffer, ARRAYSIZE(szBuffer));
}
else if (lpItem->dwStatus == ERROR_OVERRIDE_NOCHANGES)
{
LoadString(g_hInstance, IDS_OVERRIDE, szBuffer, ARRAYSIZE(szBuffer));
bBold = TRUE;
}
else if (lpItem->dwStatus == ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED)
{
LoadString(g_hInstance, IDS_SYNC_REQUIRED, szBuffer, ARRAYSIZE(szBuffer));
bBold = TRUE;
}
else
{
LoadString(g_hInstance, IDS_FAILEDMSG1, szBuffer, ARRAYSIZE(szBuffer));
bBold = TRUE;
}
if (bBold)
{
//
// Turn bold on
//
ZeroMemory (&chFormat, sizeof(chFormat));
chFormat.cbSize = sizeof(chFormat);
chFormat.dwMask = CFM_BOLD;
chFormat.dwEffects = CFE_BOLD;
SendMessage (hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
(LPARAM) &chFormat);
}
lpMsg = (LPTSTR) LocalAlloc(LPTR, (lstrlen(lpItem->lpName) + lstrlen(szBuffer) + 1) * sizeof(TCHAR));
if (!lpMsg)
{
SendMessage (hEdit, WM_SETREDRAW, TRUE, 0);
InvalidateRect (hEdit, NULL, TRUE);
UpdateWindow (hEdit);
return;
}
wsprintf (lpMsg, szBuffer, lpItem->lpName);
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) lpMsg);
LocalFree (lpMsg);
//
// Even if the CSE was successful or if it returned E_PENDING, continue on to get the
// eventlog msgs
//
StringToGuid( lpItem->lpGUID, &guid);
if (!((lpItem->dwStatus == ERROR_SUCCESS) || (lpItem->dwStatus == E_PENDING)))
{
//
// Print the error code if appropriate
//
if (lpItem->dwStatus != ERROR_OVERRIDE_NOCHANGES && lpItem->dwStatus != ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED )
{
lpMsg = (LPTSTR) LocalAlloc(LPTR, 300 * sizeof(TCHAR));
if (lpMsg)
{
LoadMessage (lpItem->dwStatus, lpMsg, 300);
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) lpMsg);
LocalFree (lpMsg);
}
}
//
// Special case GPCore to have an additional message
//
if (IsNullGUID (&guid))
{
LoadString(g_hInstance, IDS_GPCOREFAIL, szBuffer, ARRAYSIZE(szBuffer));
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) szBuffer);
}
}
else {
if (lpItem->ulLoggingStatus == 2) {
//
// Special case GPCore to have an additional message if logging failed
//
if (IsNullGUID (&guid))
{
LoadString(g_hInstance, IDS_GPCORE_LOGGINGFAIL, szBuffer, ARRAYSIZE(szBuffer));
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) szBuffer);
}
}
}
if (bBold)
{
//
// Turn bold off
//
ZeroMemory (&chFormat, sizeof(chFormat));
chFormat.cbSize = sizeof(chFormat);
chFormat.dwMask = CFM_BOLD;
SendMessage (hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
(LPARAM) &chFormat);
}
//
// Get any event log text for this CSE
//
if (m_pEvents && SUCCEEDED(m_pEvents->GetCSEEntries(&lpItem->BeginTime, &lpItem->EndTime,
lpItem->lpEventSources, &lpEventLogText,
(IsNullGUID (&guid)))))
{
//
// Put a blank line between the main message and the Additional information header
//
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) TEXT("\r\n"));
//
// Turn underline on
//
ZeroMemory (&chFormat, sizeof(chFormat));
chFormat.cbSize = sizeof(chFormat);
chFormat.dwMask = CFM_UNDERLINETYPE | CFM_UNDERLINE;
chFormat.dwEffects = CFE_UNDERLINE;
chFormat.bUnderlineType = CFU_UNDERLINE;
SendMessage (hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
(LPARAM) &chFormat);
LoadString(g_hInstance, IDS_ADDITIONALINFO, szBuffer, ARRAYSIZE(szBuffer));
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) szBuffer);
//
// Turn underline off
//
ZeroMemory (&chFormat, sizeof(chFormat));
chFormat.cbSize = sizeof(chFormat);
chFormat.dwMask = CFM_UNDERLINETYPE | CFM_UNDERLINE;
chFormat.dwEffects = CFE_UNDERLINE;
chFormat.bUnderlineType = CFU_UNDERLINENONE;
SendMessage (hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
(LPARAM) &chFormat);
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) TEXT("\r\n"));
//
// Add the event log info to the edit control
//
SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, (LPARAM) -1);
SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) lpEventLogText);
CoTaskMemFree (lpEventLogText);
}
SendMessage (hEdit, EM_SETSEL, 0, 0);
SendMessage (hEdit, EM_SCROLLCARET, 0, 0);
SendMessage (hEdit, WM_SETREDRAW, TRUE, 0);
InvalidateRect (hEdit, NULL, TRUE);
UpdateWindow (hEdit);
}
}
void CRSOPComponentData::OnSaveAs (HWND hDlg)
{
OPENFILENAME ofn;
TCHAR szFilter[100];
LPTSTR lpTemp;
TCHAR szFile[2*MAX_PATH];
HANDLE hFile;
DWORD dwSize, dwBytesWritten;
//
// Load the filter string and replace the # signs with nulls
//
LoadString (g_hInstance, IDS_ERRORFILTER, szFilter, ARRAYSIZE(szFilter));
lpTemp = szFilter;
while (*lpTemp)
{
if (*lpTemp == TEXT('#'))
*lpTemp = TEXT('\0');
lpTemp++;
}
//
// Call the Save common dialog
//
szFile[0] = TEXT('\0');
ZeroMemory (&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hDlg;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = 2*MAX_PATH;
ofn.lpstrDefExt = TEXT("txt");
ofn.Flags = OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
if (!GetSaveFileName (&ofn))
{
return;
}
SetWaitCursor ();
//
// Create the text file
//
hFile = CreateFile (szFile, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::OnSaveAs: CreateFile failed with %d"), GetLastError()));
ClearWaitCursor ();
return;
}
//
// Get the text out of the edit control
//
dwSize = (DWORD) SendDlgItemMessage (hDlg, IDC_EDIT1, WM_GETTEXTLENGTH, 0, 0);
lpTemp = (LPTSTR) LocalAlloc (LPTR, (dwSize+2) * sizeof(TCHAR));
if (!lpTemp)
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::OnSaveAs: LocalAlloc failed with %d"), GetLastError()));
CloseHandle (hFile);
ClearWaitCursor ();
return;
}
SendDlgItemMessage (hDlg, IDC_EDIT1, WM_GETTEXT, (dwSize+1), (LPARAM) lpTemp);
//
// Save it to the new file
//
WriteFile(hFile, L"\xfeff\r\n", 3 * sizeof(WCHAR), &dwBytesWritten, NULL);
if (!WriteFile (hFile, lpTemp, (dwSize * sizeof(TCHAR)), &dwBytesWritten, NULL) ||
(dwBytesWritten != (dwSize * sizeof(TCHAR))))
{
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::OnSaveAs: Failed to text with %d"),
GetLastError()));
}
LocalFree (lpTemp);
CloseHandle (hFile);
ClearWaitCursor ();
}
INT_PTR CALLBACK CRSOPComponentData::RSOPErrorsMachineProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD)
{
pCD->InitializeErrorsDialog(hDlg, pCD->m_pComputerCSEList);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case WM_COMMAND:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
if (LOWORD(wParam) == IDC_BUTTON1)
{
pCD->OnSaveAs(hDlg);
}
if (LOWORD(wParam) == IDCANCEL)
{
SendMessage(GetParent(hDlg), message, wParam, lParam);
}
}
break;
case WM_NOTIFY:
{
LPNMHDR lpHdr = (LPNMHDR)lParam;
if (lpHdr->code == LVN_ITEMCHANGED)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
}
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
pCD->RefreshErrorInfo (hDlg);
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aErrorsHelpIds);
break;
case WM_CONTEXTMENU:
// right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aErrorsHelpIds);
return TRUE;
}
return FALSE;
}
INT_PTR CALLBACK CRSOPComponentData::RSOPErrorsUserProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CRSOPComponentData * pCD;
switch (message)
{
case WM_INITDIALOG:
pCD = (CRSOPComponentData *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pCD);
if (pCD)
{
pCD->InitializeErrorsDialog(hDlg, pCD->m_pUserCSEList);
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
break;
case WM_COMMAND:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
if (LOWORD(wParam) == IDC_BUTTON1)
{
pCD->OnSaveAs(hDlg);
}
if (LOWORD(wParam) == IDCANCEL)
{
SendMessage(GetParent(hDlg), message, wParam, lParam);
}
}
break;
case WM_NOTIFY:
{
LPNMHDR lpHdr = (LPNMHDR)lParam;
if (lpHdr->code == LVN_ITEMCHANGED)
{
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
}
}
break;
break;
case WM_REFRESHDISPLAY:
pCD = (CRSOPComponentData *) GetWindowLongPtr (hDlg, DWLP_USER);
if (pCD)
{
pCD->RefreshErrorInfo (hDlg);
}
break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
(ULONG_PTR) (LPSTR) aErrorsHelpIds);
break;
case WM_CONTEXTMENU:
// right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
(ULONG_PTR) (LPSTR) aErrorsHelpIds);
return TRUE;
}
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
// //
// Class factory object implementation //
// //
///////////////////////////////////////////////////////////////////////////////
CRSOPComponentDataCF::CRSOPComponentDataCF()
{
m_cRef = 1;
InterlockedIncrement(&g_cRefThisDll);
}
CRSOPComponentDataCF::~CRSOPComponentDataCF()
{
InterlockedDecrement(&g_cRefThisDll);
}
///////////////////////////////////////////////////////////////////////////////
// //
// Class factory object implementation (IUnknown) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CRSOPComponentDataCF::AddRef()
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG)
CRSOPComponentDataCF::Release()
{
if (--m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
STDMETHODIMP
CRSOPComponentDataCF::QueryInterface(REFIID riid, LPVOID FAR* ppv)
{
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
{
*ppv = (LPCLASSFACTORY)this;
m_cRef++;
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
///////////////////////////////////////////////////////////////////////////////
// //
// Class factory object implementation (IClassFactory) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CRSOPComponentDataCF::CreateInstance(LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID FAR* ppvObj)
{
*ppvObj = NULL;
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
CRSOPComponentData *pComponentData = new CRSOPComponentData(); // ref count == 1
if (!pComponentData)
return E_OUTOFMEMORY;
HRESULT hr = pComponentData->QueryInterface(riid, ppvObj);
pComponentData->Release(); // release initial ref
return hr;
}
STDMETHODIMP
CRSOPComponentDataCF::LockServer(BOOL fLock)
{
return E_NOTIMPL;
}
///////////////////////////////////////////////////////////////////////////////
// //
// IWbemObjectSink implementation //
// //
///////////////////////////////////////////////////////////////////////////////
CCreateSessionSink::CCreateSessionSink(HWND hProgress, DWORD dwThread)
{
m_cRef = 1;
InterlockedIncrement(&g_cRefThisDll);
m_hProgress = hProgress;
m_dwThread = dwThread;
m_bSendQuitMessage = FALSE;
m_hrSuccess = S_OK;
m_pNameSpace = NULL;
m_ulErrorInfo = 0;
SendMessage (hProgress, PBM_SETPOS, 0, 0);
}
CCreateSessionSink::~CCreateSessionSink()
{
if (m_pNameSpace)
{
SysFreeString (m_pNameSpace);
}
InterlockedDecrement(&g_cRefThisDll);
}
STDMETHODIMP_(ULONG)
CCreateSessionSink::AddRef()
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG)
CCreateSessionSink::Release()
{
if (--m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
STDMETHODIMP
CCreateSessionSink::QueryInterface(REFIID riid, LPVOID FAR* ppv)
{
if (IsEqualIID(riid, IID_IUnknown))
{
*ppv = (IUnknown *)this;
m_cRef++;
return S_OK;
}
else if (IsEqualIID(riid, IID_IWbemObjectSink))
{
*ppv = (IWbemObjectSink *)this;
m_cRef++;
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
STDMETHODIMP CCreateSessionSink::SendQuitMessage (BOOL bSendQuitMessage)
{
m_bSendQuitMessage = bSendQuitMessage;
return S_OK;
}
STDMETHODIMP CCreateSessionSink::GetResult (HRESULT *hSuccess)
{
*hSuccess = m_hrSuccess;
return S_OK;
}
STDMETHODIMP CCreateSessionSink::GetNamespace (BSTR *pNamespace)
{
*pNamespace = m_pNameSpace;
return S_OK;
}
STDMETHODIMP CCreateSessionSink::GetErrorInfo (ULONG *pulErrorInfo)
{
*pulErrorInfo = m_ulErrorInfo;
return S_OK;
}
STDMETHODIMP CCreateSessionSink::Indicate(long lObjCount, IWbemClassObject **pArray)
{
LONG lIndex;
HRESULT hr;
IWbemClassObject *pObject;
for (lIndex = 0; lIndex < lObjCount; lIndex++)
{
pObject = pArray[lIndex];
hr = GetParameter(pObject, TEXT("hResult"), m_hrSuccess);
if (SUCCEEDED(hr))
{
if (SUCCEEDED(m_hrSuccess))
{
GetParameterBSTR(pObject, TEXT("nameSpace"), m_pNameSpace);
}
else
{
GetParameter(pObject, TEXT("ExtendedInfo"), m_ulErrorInfo);
}
}
DebugMsg((DM_VERBOSE, TEXT("CCreateSessionSink::Indicate: Status: 0x%x"), m_hrSuccess));
DebugMsg((DM_VERBOSE, TEXT("CCreateSessionSink::Indicate: Namespace: %s"), m_pNameSpace ? m_pNameSpace : TEXT("Null")));
DebugMsg((DM_VERBOSE, TEXT("CCreateSessionSink::Indicate: ExtendedInfo: %d"), m_ulErrorInfo));
}
return WBEM_S_NO_ERROR;
}
STDMETHODIMP CCreateSessionSink::SetStatus(LONG lFlags, HRESULT hResult,
BSTR strParam, IWbemClassObject *pObjParam)
{
HRESULT hr;
ULONG ulValue;
if (lFlags == WBEM_STATUS_PROGRESS)
{
if (m_hProgress)
{
//
// The hResult arg contains both the denominator
// and the numerator packed together.
//
// Denominator is in the high word
// Numerator is in the low word
//
ulValue = MAKELONG(HIWORD(hResult), 0);
SendMessage (m_hProgress, PBM_SETRANGE32, 0, (LPARAM) ulValue);
ulValue = MAKELONG(LOWORD(hResult), 0);
SendMessage (m_hProgress, PBM_SETPOS, (WPARAM) ulValue, 0);
DebugMsg((DM_VERBOSE, TEXT("CCreateSessionSink::SetStatus: Precentage complete: %d"), ulValue));
}
}
if (lFlags == WBEM_STATUS_COMPLETE)
{
if (m_bSendQuitMessage)
{
if (hResult != WBEM_S_NO_ERROR)
{
m_hrSuccess = hResult;
DebugMsg((DM_VERBOSE, TEXT("CCreateSessionSink::SetStatus: Setting error status to: 0x%x"), m_hrSuccess));
}
PostThreadMessage (m_dwThread, WM_QUIT, 0, 0);
}
}
return WBEM_S_NO_ERROR;
}
///////////////////////////////////////////////////////////////////////////////
// //
// Class factory implementation for rsop context menu //
// //
///////////////////////////////////////////////////////////////////////////////
CRSOPCMenuCF::CRSOPCMenuCF()
{
m_cRef = 1;
InterlockedIncrement(&g_cRefThisDll);
}
CRSOPCMenuCF::~CRSOPCMenuCF()
{
InterlockedDecrement(&g_cRefThisDll);
}
///////////////////////////////////////////////////////////////////////////////
// //
// Class factory object implementation (IUnknown) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CRSOPCMenuCF::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG)
CRSOPCMenuCF::Release()
{
m_cRef = InterlockedDecrement(&m_cRef);
if (m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
STDMETHODIMP
CRSOPCMenuCF::QueryInterface(REFIID riid, LPVOID FAR* ppv)
{
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
{
*ppv = (LPCLASSFACTORY)this;
AddRef();
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
///////////////////////////////////////////////////////////////////////////////
// //
// Class factory object implementation (IClassFactory) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CRSOPCMenuCF::CreateInstance(LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID FAR* ppvObj)
{
*ppvObj = NULL;
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
CRSOPCMenu *pRsopCMenu = new CRSOPCMenu(); // ref count == 1
if (!pRsopCMenu)
return E_OUTOFMEMORY;
HRESULT hr = pRsopCMenu->QueryInterface(riid, ppvObj);
pRsopCMenu->Release(); // release initial ref
return hr;
}
STDMETHODIMP
CRSOPCMenuCF::LockServer(BOOL fLock)
{
return E_NOTIMPL;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPCMenu implementation for rsop context menu //
// //
///////////////////////////////////////////////////////////////////////////////
CRSOPCMenu::CRSOPCMenu()
{
m_cRef = 1;
m_lpDSObject = NULL;
m_szDN = NULL;
m_szDomain = NULL;
InterlockedIncrement(&g_cRefThisDll);
}
CRSOPCMenu::~CRSOPCMenu()
{
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu:: Context menu destroyed")));
InterlockedDecrement(&g_cRefThisDll);
if (m_lpDSObject)
LocalFree(m_lpDSObject);
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPCMenu implementation (IUnknown) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CRSOPCMenu::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG)
CRSOPCMenu::Release()
{
m_cRef = InterlockedDecrement(&m_cRef);
if (m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
STDMETHODIMP
CRSOPCMenu::QueryInterface(REFIID riid, LPVOID FAR* ppv)
{
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IExtendContextMenu))
{
*ppv = (LPCLASSFACTORY)this;
AddRef();
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
///////////////////////////////////////////////////////////////////////////////
// //
// CRSOPCMenu implementation (IExtendContextMenu) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CRSOPCMenu::AddMenuItems(LPDATAOBJECT piDataObject,
LPCONTEXTMENUCALLBACK piCallback,
long * pInsertionAllowed)
{
FORMATETC fm;
STGMEDIUM medium;
LPDSOBJECTNAMES lpNames;
CONTEXTMENUITEM ctxMenu;
HRESULT hr=S_OK;
LPTSTR lpTemp;
HANDLE hTokenUser = 0;
BOOL bPlAccessGranted = FALSE, bLoAccessGranted = FALSE;
BOOL bLoNeeded = TRUE;
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: Entering")));
// if we are not allowed in the tasks menu quit
if (!((*pInsertionAllowed) & CCM_INSERTIONALLOWED_TASK )) {
return S_OK;
}
//
// Ask DS admin for the ldap path to the selected object
//
ZeroMemory (&fm, sizeof(fm));
fm.cfFormat = (WORD)m_cfDSObjectName;
fm.tymed = TYMED_HGLOBAL;
ZeroMemory (&medium, sizeof(medium));
medium.tymed = TYMED_HGLOBAL;
medium.hGlobal = GlobalAlloc (GMEM_MOVEABLE | GMEM_NODISCARD, 512);
if (medium.hGlobal)
{
hr = piDataObject->GetData(&fm, &medium);
if (SUCCEEDED(hr))
{
lpNames = (LPDSOBJECTNAMES) GlobalLock (medium.hGlobal);
if (lpNames) {
lpTemp = (LPWSTR) (((LPBYTE)lpNames) + lpNames->aObjects[0].offsetName);
if (m_lpDSObject)
{
LocalFree (m_lpDSObject);
}
m_lpDSObject = (LPTSTR) LocalAlloc (LPTR, (lstrlen (lpTemp) + 1) * sizeof(TCHAR));
if (m_lpDSObject)
{
lstrcpy (m_lpDSObject, lpTemp);
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: LDAP path from DS Admin %s"), m_lpDSObject));
}
else {
hr = HRESULT_FROM_WIN32(GetLastError());
}
m_rsopHint = RSOPHintUnknown;
if (lpNames->aObjects[0].offsetClass) {
lpTemp = (LPWSTR) (((LPBYTE)lpNames) + lpNames->aObjects[0].offsetClass);
if (lstrcmpi (lpTemp, TEXT("domainDNS")) == 0)
{
m_rsopHint = RSOPHintDomain;
}
else if (lstrcmpi (lpTemp, TEXT("organizationalUnit")) == 0)
{
m_rsopHint = RSOPHintOrganizationalUnit;
}
else if (lstrcmpi (lpTemp, TEXT("site")) == 0)
{
m_rsopHint = RSOPHintSite;
}
else if (lstrcmpi (lpTemp, TEXT("user")) == 0)
{
m_rsopHint = RSOPHintUser;
}
else if (lstrcmpi (lpTemp, TEXT("computer")) == 0)
{
m_rsopHint = RSOPHintMachine;
}
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: m_rsopHint = %d"), m_rsopHint));
} else {
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: No objectclass defined.")));
}
GlobalUnlock (medium.hGlobal);
}
else {
hr = HRESULT_FROM_WIN32(GetLastError());
}
}
GlobalFree(medium.hGlobal);
}
else {
hr = HRESULT_FROM_WIN32(GetLastError());
}
//
// if we got our data as expected add the menu
//
if (SUCCEEDED(hr)) {
LPWSTR szContainer = NULL;
//
// Now check whether the user has right to do rsop generation
// if the container is anything other than the Site
//
if (m_szDomain) {
LocalFree(m_szDomain);
m_szDomain = NULL;
}
ParseDN(m_lpDSObject, &m_szDomain, &m_szDN, &szContainer);
if ((m_rsopHint == RSOPHintMachine) || (m_rsopHint == RSOPHintUser))
bLoNeeded = TRUE;
else
bLoNeeded = FALSE;
if (m_rsopHint != RSOPHintSite) {
if (!OpenThreadToken (GetCurrentThread(), TOKEN_IMPERSONATE | TOKEN_DUPLICATE | TOKEN_QUERY, TRUE, &hTokenUser)) {
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_IMPERSONATE | TOKEN_DUPLICATE | TOKEN_QUERY, &hTokenUser)) {
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::AddMenuItems: Couldn't get process token. Error %d"), GetLastError()));
bLoAccessGranted = bPlAccessGranted = FALSE;
}
}
if (hTokenUser) {
DWORD dwErr;
dwErr = CheckAccessForPolicyGeneration( hTokenUser, szContainer, m_szDomain, FALSE, &bPlAccessGranted);
if (dwErr != ERROR_SUCCESS) {
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::AddMenuItems: CheckAccessForPolicyGeneration. Error %d"), dwErr));
bPlAccessGranted = FALSE;
}
if (bLoNeeded) {
dwErr = CheckAccessForPolicyGeneration( hTokenUser, szContainer, m_szDomain, TRUE, &bLoAccessGranted);
if (dwErr != ERROR_SUCCESS) {
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::AddMenuItems: CheckAccessForPolicyGeneration. Error %d"), dwErr));
bLoAccessGranted = FALSE;
}
}
CloseHandle(hTokenUser);
}
}
else {
bPlAccessGranted = TRUE;
}
if (bPlAccessGranted) {
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: User has right to do Planning RSOP")));
if ( ! IsPlanningModeAllowed() )
{
bPlAccessGranted = FALSE;
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: Planning mode is not available because planning mode view is not implemented on non-server SKUs")));
}
}
if (bLoAccessGranted) {
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: User has right to do Logging RSOP")));
}
//
// Add the Context menu appropriately
//
WCHAR szMenuName[150];
memset(&ctxMenu, 0, sizeof(ctxMenu));
LoadString (g_hInstance, IDS_RSOP_PLANNING, szMenuName, ARRAYSIZE(szMenuName));
ctxMenu.strName = szMenuName;
ctxMenu.strStatusBarText = NULL;
ctxMenu.lCommandID = RSOP_LAUNCH_PLANNING; // no sp. flags
ctxMenu.lInsertionPointID = CCM_INSERTIONPOINTID_3RDPARTY_TASK;
if (bPlAccessGranted)
ctxMenu.fFlags = MF_ENABLED;
else
ctxMenu.fFlags = MF_GRAYED | MF_DISABLED;
hr = piCallback->AddItem(&ctxMenu);
if (bLoNeeded) {
LoadString (g_hInstance, IDS_RSOP_LOGGING, szMenuName, ARRAYSIZE(szMenuName));
ctxMenu.strName = szMenuName;
ctxMenu.strStatusBarText = NULL;
ctxMenu.lCommandID = RSOP_LAUNCH_LOGGING; // no sp. flags
ctxMenu.lInsertionPointID = CCM_INSERTIONPOINTID_3RDPARTY_TASK;
if (bLoAccessGranted)
ctxMenu.fFlags = MF_ENABLED;
else
ctxMenu.fFlags = MF_GRAYED | MF_DISABLED;
hr = piCallback->AddItem(&ctxMenu);
}
}
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::AddMenuItems: Leaving hr = 0x%x"), hr));
return hr;
}
STDMETHODIMP
CRSOPCMenu::Command(long lCommandID, LPDATAOBJECT piDataObject)
{
DWORD dwSize = 0;
LPTSTR lpArgs=NULL, lpEnd=NULL;
SHELLEXECUTEINFO ExecInfo;
LPTSTR szUserName=NULL, szMachName=NULL;
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::Command: lCommandID = %d"), lCommandID));
//
// Launch rsop.msc with the appropriate cmd line arguments
//
dwSize += lstrlen(RSOP_MODE) + 10;
if (m_rsopHint == RSOPHintSite) {
dwSize += lstrlen(RSOP_SITENAME) + lstrlen(m_szDN)+10;
}
if (m_rsopHint == RSOPHintDomain) {
dwSize += lstrlen(RSOP_COMP_OU_PREF) + lstrlen(m_szDN)+10;
dwSize += lstrlen(RSOP_USER_OU_PREF) + lstrlen(m_szDN)+10;
}
if (m_rsopHint == RSOPHintOrganizationalUnit) {
dwSize += lstrlen(RSOP_COMP_OU_PREF) + lstrlen(m_szDN)+10;
dwSize += lstrlen(RSOP_USER_OU_PREF) + lstrlen(m_szDN)+10;
}
if (m_rsopHint == RSOPHintMachine) {
szMachName = MyTranslateName(m_szDN, NameFullyQualifiedDN, NameSamCompatible);
if (!szMachName) {
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::Command: MyTranslateName failed with error %d"), GetLastError()));
// ReportError(NULL, GetLastError(), IDS_SPAWNRSOPFAILED);
goto Exit;
}
dwSize += lstrlen(RSOP_COMP_NAME) + lstrlen(szMachName)+10;
}
if (m_rsopHint == RSOPHintUser) {
szUserName = MyTranslateName(m_szDN, NameFullyQualifiedDN, NameSamCompatible);
if (!szUserName) {
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::Command: MyTranslateName failed with error %d"), GetLastError()));
// ReportError(NULL, GetLastError(), IDS_SPAWNRSOPFAILED);
goto Exit;
}
dwSize += lstrlen(RSOP_USER_NAME) + lstrlen(szUserName)+10;
}
if (m_szDomain) {
dwSize += lstrlen(RSOP_DCNAME_PREF) + lstrlen(m_szDomain)+10;
}
lpArgs = (LPTSTR) LocalAlloc (LPTR, dwSize * sizeof(TCHAR));
if (!lpArgs)
{
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::Command: Failed to allocate memory with %d"),
GetLastError()));
// ReportError(NULL, GetLastError(), IDS_SPAWNRSOPFAILED);
goto Exit;
}
wsprintf (lpArgs, TEXT("/s "));
lpEnd = lpArgs + lstrlen(lpArgs);
//
// Build the command line arguments
//
wsprintf(lpEnd, L"%s\"%d\" ", RSOP_MODE, (lCommandID == RSOP_LAUNCH_PLANNING) ? 1 : 0);
lpEnd = lpArgs + lstrlen(lpArgs);
if (m_rsopHint == RSOPHintSite) {
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_SITENAME, m_szDN);
lpEnd = lpArgs + lstrlen(lpArgs);
}
if (m_rsopHint == RSOPHintDomain) {
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_COMP_OU_PREF, m_szDN);
lpEnd = lpArgs + lstrlen(lpArgs);
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_USER_OU_PREF, m_szDN);
lpEnd = lpArgs + lstrlen(lpArgs);
}
if (m_rsopHint == RSOPHintOrganizationalUnit) {
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_COMP_OU_PREF, m_szDN);
lpEnd = lpArgs + lstrlen(lpArgs);
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_USER_OU_PREF, m_szDN);
lpEnd = lpArgs + lstrlen(lpArgs);
}
if (m_rsopHint == RSOPHintMachine) {
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_COMP_NAME, szMachName);
lpEnd = lpArgs + lstrlen(lpArgs);
}
if (m_rsopHint == RSOPHintUser) {
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_USER_NAME, szUserName);
lpEnd = lpArgs + lstrlen(lpArgs);
}
if (m_szDomain) {
wsprintf(lpEnd, L"%s\"%s\" ", RSOP_DCNAME_PREF, m_szDomain);
lpEnd = lpArgs + lstrlen(lpArgs);
}
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::Command: Starting GPE with %s"), lpArgs));
ZeroMemory (&ExecInfo, sizeof(ExecInfo));
ExecInfo.cbSize = sizeof(ExecInfo);
ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecInfo.lpVerb = TEXT("open");
ExecInfo.lpFile = TEXT("rsop.msc");
ExecInfo.lpParameters = lpArgs;
ExecInfo.nShow = SW_SHOWNORMAL;
if (ShellExecuteEx (&ExecInfo))
{
DebugMsg((DM_VERBOSE, TEXT("CRSOPCMenu::Command: Launched rsop tool")));
SetWaitCursor();
WaitForInputIdle (ExecInfo.hProcess, 10000);
ClearWaitCursor();
CloseHandle (ExecInfo.hProcess);
}
else
{
DebugMsg((DM_WARNING, TEXT("CRSOPCMenu::Command: ShellExecuteEx failed with %d"),
GetLastError()));
// ReportError(NULL, GetLastError(), IDS_SPAWNRSOPFAILED);
goto Exit;
}
Exit:
if (szUserName) {
LocalFree(szUserName);
}
if (szMachName) {
LocalFree(szMachName);
}
if (lpArgs) {
LocalFree (lpArgs);
}
return S_OK;
}
BOOL
EnableWMIFilters( LPWSTR szGPOPath )
{
BOOL bReturn = FALSE;
LPWSTR szDomain = szGPOPath;
IWbemLocator* pLocator = 0;
IWbemServices* pServices = 0;
HRESULT hr;
while ( szDomain )
{
if ( CompareString( LOCALE_USER_DEFAULT,
NORM_IGNORECASE,
szDomain,
3,
L"DC=",
3 ) == CSTR_EQUAL )
{
break;
}
szDomain++;
}
if ( !szDomain )
{
goto Exit;
}
hr = CoCreateInstance( CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(void**) &pLocator );
if ( FAILED( hr ) )
{
goto Exit;
}
BSTR xbstrNamespace = SysAllocString( L"\\\\.\\root\\Policy" );
if ( !xbstrNamespace )
{
goto Exit;
}
hr = pLocator->ConnectServer( xbstrNamespace, // namespace
0, // user
0, // password
0, // locale
0, // security flags
0, // authority
0, // Wbem context
&pServices ); // IWbemServices
SysFreeString( xbstrNamespace );
if ( FAILED( hr ) )
{
goto Exit;
}
WCHAR szDomainCanonical[512];
DWORD dwSize = 512;
if ( !TranslateName(szDomain,
NameUnknown,
NameCanonical,
szDomainCanonical,
&dwSize ) )
{
goto Exit;
}
LPWSTR szTemp = wcsrchr( szDomainCanonical, L'/' );
if ( szTemp )
{
*szTemp = 0;
}
WCHAR szBuffer[512];
wsprintf( szBuffer, L"MSFT_SomFilterStatus.domain=\"%s\"", szDomainCanonical );
BSTR bstrObjectPath = SysAllocString( szBuffer );
if ( !bstrObjectPath )
{
goto Exit;
}
hr = CoSetProxyBlanket(pServices,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_DEFAULT,
0,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
0,
0);
IWbemClassObject* xObject = 0;
hr = pServices->GetObject( bstrObjectPath,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
0,
&xObject,
0 );
SysFreeString( bstrObjectPath );
if ( FAILED( hr ) )
{
goto Exit;
}
VARIANT var;
VariantInit(&var);
hr = xObject->Get(L"SchemaAvailable", 0, &var, NULL, NULL);
if((FAILED(hr)) || ( var.vt == VT_NULL ))
{
DebugMsg((DM_WARNING, TEXT("EnableWMIFilters: Get failed for SchemaAvailable with error 0x%x"), hr));
goto Exit;
}
if (var.boolVal == VARIANT_FALSE )
{
VariantClear(&var);
goto Exit;
}
VariantClear(&var);
DebugMsg((DM_VERBOSE, TEXT("Schema is available for wmi filters")));
bReturn = TRUE;
Exit:
if ( pLocator )
{
pLocator->Release();
}
if ( pServices )
{
pServices->Release();
}
return bReturn;
}
HRESULT CRSOPComponentData::SetupFonts()
{
HRESULT hr;
LOGFONT BigBoldLogFont;
LOGFONT BoldLogFont;
HDC pdc = NULL;
WCHAR largeFontSizeString[128];
INT largeFontSize;
WCHAR smallFontSizeString[128];
INT smallFontSize;
//
// Create the fonts we need based on the dialog font
//
NONCLIENTMETRICS ncm = {0};
ncm.cbSize = sizeof (ncm);
if (SystemParametersInfo (SPI_GETNONCLIENTMETRICS, 0, &ncm, 0) == FALSE) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto end;
}
BigBoldLogFont = ncm.lfMessageFont;
BoldLogFont = ncm.lfMessageFont;
//
// Create Big Bold Font and Bold Font
//
BigBoldLogFont.lfWeight = FW_BOLD;
BoldLogFont.lfWeight = FW_BOLD;
//
// Load size and name from resources, since these may change
// from locale to locale based on the size of the system font, etc.
//
if ( !LoadString (g_hInstance, IDS_LARGEFONTNAME, BigBoldLogFont.lfFaceName, LF_FACESIZE) )
{
ASSERT (0);
lstrcpy (BigBoldLogFont.lfFaceName, L"Verdana");
}
if ( LoadString (g_hInstance, IDS_LARGEFONTSIZE, largeFontSizeString, ARRAYSIZE(largeFontSizeString)) )
{
largeFontSize = wcstoul ((LPCWSTR) largeFontSizeString, NULL, 10);
}
else
{
ASSERT (0);
largeFontSize = 12;
}
if ( !LoadString (g_hInstance, IDS_SMALLFONTNAME, BoldLogFont.lfFaceName, LF_FACESIZE) )
{
ASSERT (0);
lstrcpy (BoldLogFont.lfFaceName, L"Verdana");
}
if ( LoadString (g_hInstance, IDS_SMALLFONTSIZE, smallFontSizeString, ARRAYSIZE(smallFontSizeString)) )
{
smallFontSize = wcstoul ((LPCWSTR) smallFontSizeString, NULL, 10);
}
else
{
ASSERT (0);
smallFontSize = 8;
}
pdc = GetDC (NULL);
if (pdc == NULL) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto end;
}
BigBoldLogFont.lfHeight = 0 - (GetDeviceCaps (pdc, LOGPIXELSY) * largeFontSize / 72);
BoldLogFont.lfHeight = 0 - (GetDeviceCaps (pdc, LOGPIXELSY) * smallFontSize / 72);
m_BigBoldFont = CreateFontIndirect (&BigBoldLogFont);
if (m_BigBoldFont == NULL) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto end;
}
m_BoldFont = CreateFontIndirect (&BoldLogFont);
if (m_BoldFont == NULL) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto end;
}
hr = S_OK;
end:
if (pdc != NULL) {
ReleaseDC (NULL, pdc);
pdc = NULL;
}
return hr;
}