You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7892 lines
284 KiB
7892 lines
284 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994 - 2001.
|
|
//
|
|
// File: RSOPWizardDlg.cpp
|
|
//
|
|
// Contents: implementation of RSOP wizard dialog
|
|
//
|
|
// Classes: CRSOPWizardDlg
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 08-08-2001 rhynierm Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "main.h"
|
|
#include "RSOPWizardDlg.h"
|
|
|
|
#include "RSOPWizard.h"
|
|
#include "RSOPUtil.h"
|
|
#include "objsel.h" // for the object picker
|
|
#include "sddl.h" // for sid to string functions
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Private global variables
|
|
|
|
|
|
DWORD g_aBrowseForOUHelpIds[] =
|
|
{
|
|
DSBID_BANNER, IDH_RSOP_BANNER,
|
|
DSBID_CONTAINERLIST, IDH_RSOP_CONTAINERLIST,
|
|
|
|
0, 0
|
|
};
|
|
|
|
DWORD g_aBrowseDCHelpIds[] =
|
|
{
|
|
IDC_LIST1, IDH_RSOP_BROWSEDC,
|
|
|
|
0, 0
|
|
};
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Private helper methods
|
|
|
|
WCHAR * NameWithoutDomain(WCHAR * szName); // In RSOPWizard.cpp
|
|
TCHAR* NormalizedComputerName(TCHAR * szComputerName ); // In RSOPRoot.cpp
|
|
BOOL CopyString( LPTSTR szSource, LPTSTR* pszTarget ); // In RSOPQuery.cpp
|
|
BOOL FreeStringList( DWORD dwCount, LPTSTR* aszStrings ); // In RSOPQuery.cpp
|
|
BOOL FreeTargetData( LPRSOP_QUERY_TARGET pTarget ); // In RSOPQuery.cpp
|
|
BOOL FreeTarget( LPRSOP_QUERY_TARGET pTarget ); // In RSOPQuery.cpp
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// TranslateNameXForest
|
|
//
|
|
// Purpose: a method to do name translations (similar to TranslateName),
|
|
// but that also works with names in other forests.
|
|
|
|
DWORD DsNameErrorMap[] = { ERROR_SUCCESS,
|
|
ERROR_NO_SUCH_USER,
|
|
ERROR_NO_SUCH_USER,
|
|
ERROR_NONE_MAPPED,
|
|
ERROR_NONE_MAPPED,
|
|
ERROR_SOME_NOT_MAPPED,
|
|
ERROR_SOME_NOT_MAPPED
|
|
};
|
|
|
|
#define MapDsNameError( x ) ((x < sizeof( DsNameErrorMap ) / sizeof( DWORD ) ) ? \
|
|
DsNameErrorMap[ x ] : ERROR_GEN_FAILURE )
|
|
|
|
BOOLEAN
|
|
TranslateNameXForest (
|
|
LPTSTR szDomain, // Domain where the name should be resolved
|
|
LPCTSTR lpAccountName, // object name
|
|
DS_NAME_FORMAT AccountNameFormat, // name format
|
|
DS_NAME_FORMAT DesiredNameFormat, // new name format
|
|
LPTSTR *lpTranslatedName // returned name buffer
|
|
)
|
|
{
|
|
BOOL bRetry = FALSE;
|
|
DWORD dwErr;
|
|
PDOMAIN_CONTROLLER_INFO pDCInfo = NULL;
|
|
HANDLE hDS = NULL;
|
|
PDS_NAME_RESULT pResult = NULL;
|
|
BOOLEAN bRet = FALSE;
|
|
LPWSTR szTransName = NULL;
|
|
|
|
|
|
DebugMsg(( DM_VERBOSE, L"TranslateNameXForest: Resolving name <%s> at Domain <%s>", lpAccountName, szDomain ? szDomain : L""));
|
|
|
|
|
|
//
|
|
// get a DC and bind to it. Make sure to force rediscover a DC if the bind fails
|
|
//
|
|
|
|
|
|
for (;;) {
|
|
|
|
dwErr = DsGetDcName( NULL,
|
|
szDomain ? szDomain : L"",
|
|
NULL,
|
|
NULL,
|
|
DS_DIRECTORY_SERVICE_REQUIRED |
|
|
DS_RETURN_DNS_NAME |
|
|
(bRetry ? DS_FORCE_REDISCOVERY : 0) |
|
|
0,
|
|
&pDCInfo );
|
|
|
|
if (dwErr == NO_ERROR) {
|
|
dwErr = DsBind( pDCInfo->DomainControllerName,
|
|
NULL,
|
|
&hDS );
|
|
|
|
if (dwErr == NO_ERROR) {
|
|
break;
|
|
}
|
|
else {
|
|
DebugMsg(( DM_WARNING, L"TranslateNameXForest: Failed to bind to DC <%s> with error %d",
|
|
pDCInfo->DomainControllerName, dwErr ));
|
|
NetApiBufferFree(pDCInfo);
|
|
pDCInfo = NULL;
|
|
}
|
|
|
|
}
|
|
else {
|
|
DebugMsg(( DM_WARNING, L"TranslateNameXForest: Failed to get DC for domain <%s> with error %d",
|
|
szDomain ? szDomain : L"", dwErr ));
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Failed to bind to a DC. bail
|
|
//
|
|
|
|
if (bRetry) {
|
|
goto Exit;
|
|
}
|
|
|
|
bRetry = TRUE;
|
|
}
|
|
|
|
DebugMsg(( DM_VERBOSE, L"TranslateNameXForest: DC selected is <%s>", pDCInfo->DomainControllerName ));
|
|
|
|
|
|
//
|
|
// Now crack names with the DC that is bound
|
|
//
|
|
|
|
dwErr = DsCrackNames( hDS,
|
|
DS_NAME_NO_FLAGS,
|
|
AccountNameFormat,
|
|
DesiredNameFormat,
|
|
1,
|
|
&lpAccountName,
|
|
&pResult);
|
|
|
|
if (dwErr != DS_NAME_NO_ERROR) {
|
|
DebugMsg(( DM_WARNING, L"TranslateNameXForest: Failed to crack names with error %d", dwErr ));
|
|
goto Exit;
|
|
}
|
|
|
|
if ( pResult->cItems == 0 ) {
|
|
DebugMsg(( DM_WARNING, L"TranslateNameXForest: Failed to return enough result items" ));
|
|
dwErr = ERROR_INVALID_DATA;
|
|
goto Exit;
|
|
}
|
|
|
|
|
|
if ( pResult->rItems[0].status == DS_NAME_NO_ERROR ) {
|
|
|
|
//
|
|
// In case of no error, return the resolved name
|
|
//
|
|
DWORD dwTransNameLength = 1 + lstrlen(pResult->rItems[0].pName);
|
|
szTransName = (LPWSTR)LocalAlloc(LPTR, sizeof(WCHAR) * ( dwTransNameLength ));
|
|
|
|
if (!szTransName) {
|
|
DebugMsg(( DM_WARNING, L"TranslateNameXForest: Failed to allocate memory for domain" ));
|
|
dwErr = GetLastError();
|
|
goto Exit;
|
|
}
|
|
|
|
HRESULT hr = StringCchCopy(szTransName, dwTransNameLength, pResult->rItems[0].pName);
|
|
|
|
if(FAILED(hr)) {
|
|
dwErr = HRESULT_CODE(hr);
|
|
goto Exit;
|
|
}
|
|
|
|
*lpTranslatedName = szTransName;
|
|
szTransName = NULL;
|
|
}
|
|
else {
|
|
|
|
//
|
|
// remap the error code to win32 error
|
|
//
|
|
|
|
DebugMsg(( DM_WARNING, L"TranslateNameXForest: DsCrackNames failed with error %d", pResult->rItems[0].status ));
|
|
dwErr = MapDsNameError(pResult->rItems[0].status);
|
|
goto Exit;
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
Exit:
|
|
if ( szTransName ) {
|
|
LocalFree( szTransName );
|
|
}
|
|
|
|
if ( pDCInfo ) {
|
|
NetApiBufferFree(pDCInfo);
|
|
}
|
|
|
|
if (hDS) {
|
|
DsUnBind( &hDS );
|
|
}
|
|
|
|
if (pResult) {
|
|
DsFreeNameResult(pResult);
|
|
}
|
|
|
|
if ( !bRet )
|
|
{
|
|
SetLastError( dwErr );
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
LPTSTR GetDomainFromSOM (LPTSTR lpSOM)
|
|
{
|
|
LPTSTR lpFullName, lpResult;
|
|
LPOLESTR lpLdapDomain, lpDomainName;
|
|
HRESULT hr;
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(lpSOM) + 10;
|
|
lpFullName = (LPTSTR) LocalAlloc (LPTR, ulNoChars * sizeof(TCHAR));
|
|
|
|
if (!lpFullName)
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetDomainFromSOM: Failed to allocate memory with %d."), GetLastError()));
|
|
return NULL;
|
|
}
|
|
|
|
hr = StringCchCopy (lpFullName, ulNoChars, TEXT("LDAP://"));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat (lpFullName, ulNoChars, lpSOM);
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
LocalFree(lpFullName);
|
|
return NULL;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
ulNoChars = lstrlen(lpDomainName) + 1;
|
|
lpResult = new TCHAR[ulNoChars];
|
|
|
|
if (lpResult)
|
|
{
|
|
hr = StringCchCopy (lpResult, ulNoChars, lpDomainName);
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
|
|
LocalFree (lpDomainName);
|
|
|
|
return lpResult;
|
|
}
|
|
//-------------------------------------------------------
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
//*************************************************************
|
|
//
|
|
// 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;
|
|
}
|
|
}
|
|
//-------------------------------------------------------
|
|
|
|
void GetControlText(HWND hDlg, DWORD ctrlid, TCHAR * &szControlText, BOOL bUseLocalAlloc)
|
|
{
|
|
UINT nSize;
|
|
|
|
if ( szControlText != NULL )
|
|
{
|
|
if ( bUseLocalAlloc )
|
|
{
|
|
LocalFree( szControlText );
|
|
}
|
|
else
|
|
{
|
|
delete [] szControlText;
|
|
}
|
|
szControlText = NULL;
|
|
}
|
|
|
|
nSize = (UINT) SendMessage(GetDlgItem(hDlg, ctrlid),
|
|
WM_GETTEXTLENGTH, 0, 0);
|
|
|
|
if (nSize > 0)
|
|
{
|
|
if ( bUseLocalAlloc )
|
|
{
|
|
szControlText = (TCHAR*)LocalAlloc( LPTR, (nSize+1)*sizeof(TCHAR) );
|
|
}
|
|
else
|
|
{
|
|
szControlText = new TCHAR[nSize + 1];
|
|
}
|
|
if (szControlText)
|
|
{
|
|
LPTSTR lpDest, lpSrc;
|
|
|
|
GetDlgItemText(hDlg, ctrlid, szControlText, nSize + 1);
|
|
|
|
if (szControlText[0] == TEXT(' '))
|
|
{
|
|
//
|
|
// Remove leading blanks by shuffling the characters forward
|
|
//
|
|
|
|
lpDest = lpSrc = szControlText;
|
|
|
|
while ((*lpSrc == TEXT(' ')) && *lpSrc)
|
|
lpSrc++;
|
|
|
|
if (*lpSrc)
|
|
{
|
|
while (*lpSrc)
|
|
{
|
|
*lpDest = *lpSrc;
|
|
lpDest++;
|
|
lpSrc++;
|
|
}
|
|
*lpDest = TEXT('\0');
|
|
}
|
|
}
|
|
|
|
//
|
|
// Remove trailing blanks
|
|
//
|
|
|
|
lpDest = szControlText + lstrlen(szControlText) - 1;
|
|
|
|
while ((*lpDest == TEXT(' ')) && (lpDest >= szControlText))
|
|
lpDest--;
|
|
|
|
*(lpDest+1) = TEXT('\0');
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT ImplementBrowseButton(HWND hDlg, DWORD dwFlagsUp, DWORD dwFlagsDown,
|
|
DWORD dwflScope, HWND hLB, TCHAR * &szFoundObject)
|
|
{
|
|
// 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;
|
|
LPTSTR szDomain = NULL;
|
|
LPWSTR szUnEscapedPath = NULL;
|
|
|
|
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
|
|
//
|
|
|
|
szDomain = GetDomainFromSOM( lpTemp );
|
|
|
|
//
|
|
// ADSI escapes '/' which is not liked by native ldap.
|
|
// APIs like DsCrackNames/TranslateName etc.
|
|
// Previous function (GetDomainFromSOM) needs it though
|
|
// because it is using adsi interfaces internally
|
|
//
|
|
|
|
hr = UnEscapeLdapPath(lpTemp, &szUnEscapedPath);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
|
|
DebugMsg((DM_WARNING, TEXT("ImplementBrowseButton: UnEscapeLdapPath for %s failed with 0x%x."),
|
|
lpTemp, hr));
|
|
goto Browse_Cleanup;
|
|
}
|
|
|
|
if (TranslateNameXForest ( szDomain, szUnEscapedPath, (DS_NAME_FORMAT)NameFullyQualifiedDN,
|
|
(DS_NAME_FORMAT)NameSamCompatible, &szFoundObject ))
|
|
{
|
|
BOOL bDollarRemoved = FALSE;
|
|
|
|
if (szFoundObject[wcslen(szFoundObject)-1] == L'$')
|
|
{
|
|
bDollarRemoved = TRUE;
|
|
szFoundObject[wcslen(szFoundObject)-1] = 0;
|
|
}
|
|
|
|
if (hLB)
|
|
{
|
|
INT iIndex;
|
|
|
|
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) szFoundObject);
|
|
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) ((bDollarRemoved) ? 2: 0));
|
|
|
|
SendMessage (hLB, LB_SETCURSEL, (WPARAM) iIndex, 0);
|
|
LocalFree( szFoundObject );
|
|
szFoundObject = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
|
|
DebugMsg((DM_WARNING, TEXT("ImplementBrowseButton: TranslateName for %s to SAM style failed with %d."),
|
|
lpTemp, GetLastError()));
|
|
goto Browse_Cleanup;
|
|
}
|
|
}
|
|
|
|
|
|
Browse_Cleanup:
|
|
if (szUnEscapedPath)
|
|
LocalFree(szUnEscapedPath);
|
|
|
|
if (pDsSelList)
|
|
GlobalUnlock (pDsSelList);
|
|
if (bAllocatedStgMedium)
|
|
ReleaseStgMedium (&stgmedium);
|
|
if (pdo)
|
|
pdo->Release();
|
|
if (pDsObjectPicker)
|
|
pDsObjectPicker->Release();
|
|
if (szDomain)
|
|
delete [] szDomain;
|
|
return hr;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT GetForestFromDC( LPTSTR szDC, LPTSTR* pszForest )
|
|
{
|
|
DSROLE_PRIMARY_DOMAIN_INFO_BASIC* psDomainInfo( NULL );
|
|
DWORD dwResult( ERROR_SUCCESS );
|
|
|
|
if ( (szDC == NULL) || (*pszForest != NULL) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
dwResult = ::DsRoleGetPrimaryDomainInformation( szDC, DsRolePrimaryDomainInfoBasic, (PBYTE*) &psDomainInfo );
|
|
if ( dwResult != ERROR_SUCCESS )
|
|
{
|
|
return HRESULT_FROM_WIN32( dwResult );
|
|
}
|
|
|
|
CopyString( psDomainInfo->DomainForestName, pszForest );
|
|
|
|
::DsRoleFreeMemory( psDomainInfo );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT GetForestFromObject( LPTSTR szDomainObject, LPTSTR* pszForest )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
LPTSTR szDomain = ExtractDomain( szDomainObject );
|
|
|
|
if ( szDomain != NULL )
|
|
{
|
|
LPTSTR szDC = GetDCName( szDomain, NULL, NULL, FALSE, 0, DS_RETURN_DNS_NAME);
|
|
if ( szDC != NULL )
|
|
{
|
|
hr = GetForestFromDC( szDC, pszForest );
|
|
|
|
LocalFree( szDC );
|
|
}
|
|
|
|
delete [] szDomain;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT GetForestFromContainer( LPTSTR szDSContainer, LPTSTR* pszForest )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
LPTSTR szDomain = GetDomainFromSOM( szDSContainer );
|
|
|
|
if ( szDomain != NULL )
|
|
{
|
|
LPTSTR szDC = GetDCName( szDomain, NULL, NULL, FALSE, 0, DS_RETURN_DNS_NAME);
|
|
if ( szDC != NULL )
|
|
{
|
|
hr = GetForestFromDC( szDC, pszForest );
|
|
|
|
LocalFree( szDC );
|
|
}
|
|
|
|
delete [] szDomain;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// CRSOPWizardDlg class
|
|
//
|
|
|
|
CRSOPWizardDlg::CRSOPWizardDlg( LPRSOP_QUERY pQuery, CRSOPExtendedProcessing* pExtendedProcessing )
|
|
{
|
|
m_bPostXPBuild = FALSE; // Assume this is not post XP until verified as otherwise
|
|
OSVERSIONINFOEX osvi;
|
|
|
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
|
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|
|
|
if ( GetVersionEx ((OSVERSIONINFO*) &osvi) )
|
|
{
|
|
// Windows XP was version 5.1, while .Net Server is version 5.2. So, we enable the
|
|
// additional features for any version past XP, i.e. >= 5.2
|
|
m_bPostXPBuild = (osvi.dwMajorVersion >= 5) && (osvi.dwMinorVersion >= 2) && (VER_NT_WORKSTATION != osvi.wProductType);
|
|
}
|
|
|
|
m_dwSkippedFrom = 0;
|
|
|
|
m_pRSOPQuery = pQuery;
|
|
m_pRSOPQueryResults = NULL;
|
|
|
|
m_hrQuery = E_FAIL;
|
|
m_bNoChooseQuery = FALSE;
|
|
|
|
// Initialize local variables
|
|
m_szDefaultUserSOM = NULL;
|
|
m_szDefaultComputerSOM = NULL;
|
|
m_pComputerObject = NULL;
|
|
m_pUserObject = NULL;
|
|
|
|
m_bDollarRemoved = FALSE;
|
|
m_bNoCurrentUser = FALSE;
|
|
|
|
m_dwDefaultUserSecurityGroupCount = 0;
|
|
m_aszDefaultUserSecurityGroups = NULL;
|
|
m_adwDefaultUserSecurityGroupsAttr = NULL;
|
|
|
|
m_dwDefaultUserWQLFilterCount = 0;
|
|
m_aszDefaultUserWQLFilters = NULL;
|
|
m_aszDefaultUserWQLFilterNames = NULL;
|
|
|
|
m_dwDefaultComputerSecurityGroupCount = 0;
|
|
m_aszDefaultComputerSecurityGroups = NULL;
|
|
m_adwDefaultComputerSecurityGroupsAttr = NULL;
|
|
|
|
m_dwDefaultComputerWQLFilterCount = 0;
|
|
m_aszDefaultComputerWQLFilters = NULL;
|
|
m_aszDefaultComputerWQLFilterNames = NULL;
|
|
m_bFinalNextClicked = FALSE;
|
|
|
|
m_pExtendedProcessing = pExtendedProcessing;
|
|
m_lPlanningFinishedPage = 0;
|
|
m_lLoggingFinishedPage = 0;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
CRSOPWizardDlg::~CRSOPWizardDlg()
|
|
{
|
|
delete [] m_szDefaultUserSOM;
|
|
delete [] m_szDefaultComputerSOM;
|
|
|
|
if ( m_pComputerObject != NULL )
|
|
{
|
|
m_pComputerObject->Release();
|
|
m_pComputerObject = NULL;
|
|
}
|
|
|
|
if ( m_pUserObject != NULL )
|
|
{
|
|
m_pUserObject->Release();
|
|
m_pUserObject = NULL;
|
|
}
|
|
|
|
if ( m_dwDefaultUserSecurityGroupCount != 0 )
|
|
{
|
|
LocalFree( m_aszDefaultUserSecurityGroups );
|
|
LocalFree( m_adwDefaultUserSecurityGroupsAttr );
|
|
}
|
|
|
|
if ( m_dwDefaultUserWQLFilterCount != 0 )
|
|
{
|
|
LocalFree( m_aszDefaultUserWQLFilters );
|
|
LocalFree( m_aszDefaultUserWQLFilterNames );
|
|
}
|
|
|
|
if ( m_dwDefaultComputerSecurityGroupCount != 0 )
|
|
{
|
|
LocalFree( m_aszDefaultComputerSecurityGroups );
|
|
LocalFree( m_adwDefaultComputerSecurityGroupsAttr );
|
|
}
|
|
|
|
if ( m_dwDefaultComputerWQLFilterCount != 0 )
|
|
{
|
|
LocalFree( m_aszDefaultComputerWQLFilters );
|
|
LocalFree( m_aszDefaultComputerWQLFilterNames );
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::FreeUserData ()
|
|
// RSOP_PLANNING_MODE : Only called from RSOPTargetDlgProc
|
|
{
|
|
if ( m_pRSOPQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
FreeTargetData( m_pRSOPQuery->pUser );
|
|
m_pRSOPQuery->pUser->bAssumeWQLFiltersTrue = TRUE;
|
|
}
|
|
else
|
|
{
|
|
LocalFree( m_pRSOPQuery->szUserName );
|
|
m_pRSOPQuery->szUserName = NULL;
|
|
LocalFree( m_pRSOPQuery->szUserSid );
|
|
m_pRSOPQuery->szUserSid = NULL;
|
|
}
|
|
|
|
if ( m_szDefaultUserSOM != NULL )
|
|
{
|
|
delete [] m_szDefaultUserSOM;
|
|
m_szDefaultUserSOM = NULL;
|
|
}
|
|
|
|
if ( m_dwDefaultUserSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( m_dwDefaultUserSecurityGroupCount, m_aszDefaultUserSecurityGroups );
|
|
m_aszDefaultUserSecurityGroups = NULL;
|
|
LocalFree( m_adwDefaultUserSecurityGroupsAttr );
|
|
m_adwDefaultUserSecurityGroupsAttr = NULL;
|
|
m_dwDefaultUserSecurityGroupCount = 0;
|
|
}
|
|
|
|
if ( m_dwDefaultUserWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( m_dwDefaultUserWQLFilterCount, m_aszDefaultUserWQLFilterNames );
|
|
m_aszDefaultUserWQLFilterNames = NULL;
|
|
FreeStringList( m_dwDefaultUserWQLFilterCount, m_aszDefaultUserWQLFilters );
|
|
m_aszDefaultUserWQLFilters = NULL;
|
|
m_dwDefaultUserWQLFilterCount = 0;
|
|
}
|
|
|
|
if ( m_pUserObject != NULL )
|
|
{
|
|
m_pUserObject->Release();
|
|
m_pUserObject = NULL;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::FreeComputerData ()
|
|
// RSOP_PLANNING_MODE : Only called from RSOPTargetDlgProc
|
|
{
|
|
if ( m_pRSOPQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
FreeTargetData( m_pRSOPQuery->pComputer );
|
|
m_pRSOPQuery->pComputer->bAssumeWQLFiltersTrue = TRUE;
|
|
}
|
|
else
|
|
{
|
|
LocalFree( m_pRSOPQuery->szComputerName );
|
|
m_pRSOPQuery->szComputerName = NULL;
|
|
}
|
|
|
|
if ( m_szDefaultComputerSOM != NULL )
|
|
{
|
|
delete [] m_szDefaultComputerSOM;
|
|
m_szDefaultComputerSOM = NULL;
|
|
}
|
|
|
|
if ( m_dwDefaultComputerSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( m_dwDefaultComputerSecurityGroupCount, m_aszDefaultComputerSecurityGroups );
|
|
m_aszDefaultComputerSecurityGroups = NULL;
|
|
LocalFree( m_adwDefaultComputerSecurityGroupsAttr );
|
|
m_adwDefaultComputerSecurityGroupsAttr = NULL;
|
|
m_dwDefaultComputerSecurityGroupCount = 0;
|
|
}
|
|
|
|
if ( m_dwDefaultComputerWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( m_dwDefaultComputerWQLFilterCount, m_aszDefaultComputerWQLFilterNames );
|
|
m_aszDefaultComputerWQLFilterNames = NULL;
|
|
FreeStringList( m_dwDefaultComputerWQLFilterCount, m_aszDefaultComputerWQLFilters );
|
|
m_aszDefaultComputerWQLFilters = NULL;
|
|
m_dwDefaultComputerWQLFilterCount = 0;
|
|
}
|
|
|
|
if ( m_pComputerObject != NULL )
|
|
{
|
|
m_pComputerObject->Release();
|
|
m_pComputerObject = NULL;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
// Wizard interface
|
|
|
|
HRESULT CRSOPWizardDlg::ShowWizard( HWND hParent )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
PROPSHEETPAGE psp;
|
|
HPROPSHEETPAGE hPage;
|
|
TCHAR szTitle[150];
|
|
TCHAR szSubTitle[300];
|
|
|
|
HPROPSHEETPAGE hShowNowPages[20];
|
|
DWORD dwCount=0, dwDiagStartPage = 0, dwPlanStartPage = 0, dwDiagFinishPage = 0, dwPlanFinishPage = 0;
|
|
|
|
|
|
|
|
hr = SetupFonts();
|
|
if ( FAILED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
// ------------------------------
|
|
// Create all the wizard property pages
|
|
|
|
// (1) --- Welcome ---
|
|
// LoadString (g_hInstance, IDS_TITLE_WELCOME, szTitle, ARRAYSIZE(szTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (2) --- Choose Mode ---
|
|
LoadString (g_hInstance, IDS_TITLE_CHOOSEMODE, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_CHOOSEMODE, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (3) --- GetComp ---
|
|
LoadString (g_hInstance, IDS_TITLE_GETCOMP, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_GETCOMP, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwDiagStartPage = dwCount;
|
|
dwCount++;
|
|
|
|
// (4) --- GetUser ---
|
|
LoadString (g_hInstance, IDS_TITLE_GETUSER, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_GETUSER, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (5) --- GetTarget ---
|
|
LoadString (g_hInstance, IDS_TITLE_GETTARGET, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_GETTARGET, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwPlanStartPage = dwCount;
|
|
dwCount++;
|
|
|
|
// (6) --- GetDC ---
|
|
LoadString (g_hInstance, IDS_TITLE_GETDC, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_GETDC, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (7) --- AltDirs ---
|
|
LoadString (g_hInstance, IDS_TITLE_ALTDIRS, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_ALTDIRS, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (8) --- AltUserSec ---
|
|
LoadString (g_hInstance, IDS_TITLE_USERSECGRPS, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_USERSECGRPS, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (9) --- AltCompSec ---
|
|
LoadString (g_hInstance, IDS_TITLE_COMPSECGRPS, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_COMPSECGRPS, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (10) --- WQLUser ---
|
|
LoadString (g_hInstance, IDS_TITLE_WQLUSER, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_WQL, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (11) --- WQLComp ---
|
|
LoadString (g_hInstance, IDS_TITLE_WQLCOMP, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_WQL, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
// (12) --- Finished ---
|
|
LoadString (g_hInstance, IDS_TITLE_FINISHED, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_FINISHED, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
|
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
|
|
psp.hInstance = g_hInstance;
|
|
if ( m_pExtendedProcessing != NULL )
|
|
{
|
|
m_lLoggingFinishedPage = IDD_RSOP_FINISHED_INT;
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_FINISHED_INT);
|
|
}
|
|
else
|
|
{
|
|
m_lLoggingFinishedPage = IDD_RSOP_FINISHED;
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwDiagFinishPage = dwCount;
|
|
dwCount++;
|
|
|
|
// (13) --- Finished3 ---
|
|
LoadString (g_hInstance, IDS_TITLE_FINISHED, szTitle, ARRAYSIZE(szTitle));
|
|
LoadString (g_hInstance, IDS_SUBTITLE_FINISHED, szSubTitle, ARRAYSIZE(szSubTitle));
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
|
psp.dwFlags = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
|
|
psp.hInstance = g_hInstance;
|
|
if ( m_pExtendedProcessing != NULL )
|
|
{
|
|
m_lPlanningFinishedPage = IDD_RSOP_FINISHED3_INT;
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_RSOP_FINISHED3_INT);
|
|
}
|
|
else
|
|
{
|
|
m_lPlanningFinishedPage = IDD_RSOP_FINISHED3;
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwPlanFinishPage = dwCount;
|
|
dwCount++;
|
|
|
|
// (14) --- Finished2 ---
|
|
::memset( &psp, 0, sizeof(PROPSHEETPAGE) );
|
|
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("CRSOPWizardDlg::CreatePropertyPages: Failed to create property sheet page with %d."),
|
|
GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hShowNowPages[dwCount] = hPage;
|
|
dwCount++;
|
|
|
|
if ( (m_pRSOPQuery->dwFlags & RSOP_FIX_QUERYTYPE) == RSOP_FIX_QUERYTYPE )
|
|
{
|
|
m_bNoChooseQuery = FALSE;
|
|
}
|
|
else
|
|
{
|
|
m_bNoChooseQuery = ((m_pRSOPQuery->dwFlags & RSOP_FIX_COMPUTER) == RSOP_FIX_COMPUTER)
|
|
|| ((m_pRSOPQuery->dwFlags & RSOP_FIX_DC) == RSOP_FIX_DC)
|
|
|| ((m_pRSOPQuery->dwFlags & RSOP_FIX_SITENAME) == RSOP_FIX_SITENAME)
|
|
|| ((m_pRSOPQuery->dwFlags & RSOP_FIX_USER) == RSOP_FIX_USER);
|
|
}
|
|
|
|
// ------------------------------
|
|
// Now create the Property Sheet
|
|
|
|
INT_PTR iRet;
|
|
PROPSHEETHEADER psph;
|
|
|
|
::memset( &psph, 0, sizeof(PROPSHEETHEADER) );
|
|
psph.dwSize = sizeof(PROPSHEETHEADER);
|
|
psph.dwFlags = PSH_WIZARD97 | PSH_HEADER | PSH_WATERMARK;
|
|
psph.hwndParent = hParent;
|
|
psph.hInstance = g_hInstance;
|
|
psph.nPages = dwCount;
|
|
psph.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
|
|
psph.pszbmWatermark = MAKEINTRESOURCE(IDB_WIZARD);
|
|
|
|
|
|
// if (dwFlags & RSOPMSC_OVERRIDE)
|
|
if ( (m_pRSOPQuery->dwFlags & RSOP_NO_WELCOME) == RSOP_NO_WELCOME )
|
|
{
|
|
// RM: This condition translates to a case where an MSC was loaded but where parameters where passed, overriding
|
|
// the values in the MSC file.
|
|
psph.nStartPage = ( m_pRSOPQuery->QueryType == RSOP_LOGGING_MODE) ? dwDiagStartPage : dwPlanStartPage;
|
|
DebugMsg((DM_VERBOSE, TEXT("CRSOPWizardDlg::CreatePropertyPages: Showing prop sheet in override mode.")));
|
|
}
|
|
|
|
psph.phpage = hShowNowPages;
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("CRSOPWizardDlg::CreatePropertyPages: Showing prop sheet.")));
|
|
iRet = PropertySheet(&psph);
|
|
|
|
if (iRet == -1) {
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPWizardDlg::CreatePropertyPages: PropertySheet failed with error %d."),
|
|
GetLastError()));
|
|
}
|
|
|
|
// user cancelled in the wizard
|
|
if (iRet != IDOK)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
return m_hrQuery;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::RunQuery( HWND hParent )
|
|
{
|
|
if ( DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_RSOP_STATUSMSC),
|
|
hParent, InitRsopDlgProc, (LPARAM) this ) == -1)
|
|
{
|
|
|
|
HRESULT hr = HRESULT_FROM_WIN32( GetLastError() );
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::Load: Falied to create dialog box. 0x%x"), hr));
|
|
return hr;
|
|
}
|
|
|
|
return m_hrQuery;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
// RSOP generation dialog method
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::InitRsopDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
TCHAR szMessage[200];
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) lParam;
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
if (pWizard)
|
|
{
|
|
CRSOPWizard::InitializeResultsList (GetDlgItem (hDlg, IDC_LIST1));
|
|
CRSOPWizard::FillResultsList (GetDlgItem (hDlg, IDC_LIST1), pWizard->m_pRSOPQuery, NULL);
|
|
}
|
|
|
|
PostMessage(hDlg, WM_INITRSOP, 0, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_INITRSOP:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
// RM: InitializeRSOP used to be called here, but now we go directly to GenerateRSOPEx
|
|
pWizard->m_hrQuery = CRSOPWizard::GenerateRSOPDataEx(hDlg, pWizard->m_pRSOPQuery, &(pWizard->m_pRSOPQueryResults) );
|
|
if ( pWizard->m_hrQuery != S_OK )
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitRsopDlgProc: GenerateRSOPEx failed with 0x%x."), hr));
|
|
EndDialog(hDlg, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
if ( pWizard->m_pExtendedProcessing != NULL )
|
|
{
|
|
pWizard->m_pExtendedProcessing->DoProcessing( pWizard->m_pRSOPQuery,
|
|
pWizard->m_pRSOPQueryResults,
|
|
pWizard->m_pExtendedProcessing->GetExtendedErrorInfo() );
|
|
}
|
|
|
|
EndDialog(hDlg, 1);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPWelcomeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
TCHAR szDefaultGPO[128];
|
|
|
|
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_RSOP_BIG_BOLD1),
|
|
WM_SETFONT, (WPARAM)pWizard->m_BigBoldFont, (LPARAM)TRUE);
|
|
|
|
/*
|
|
if (!pWizard->m_hChooseBitmap)
|
|
{
|
|
pWizard->m_hChooseBitmap = (HBITMAP) LoadImage (g_hInstance,
|
|
MAKEINTRESOURCE(IDB_WIZARD),
|
|
IMAGE_BITMAP, 0, 0,
|
|
LR_DEFAULTCOLOR);
|
|
}
|
|
|
|
if (pWizard->m_hChooseBitmap)
|
|
{
|
|
SendDlgItemMessage (hDlg, IDC_BITMAP, STM_SETIMAGE,
|
|
IMAGE_BITMAP, (LPARAM) pWizard->m_hChooseBitmap);
|
|
}
|
|
*/
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_NEXT);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
if ( (pQuery->dwFlags & RSOP_FIX_QUERYTYPE) == RSOP_FIX_QUERYTYPE )
|
|
{
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETTARGET);
|
|
}
|
|
else
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETCOMP);
|
|
}
|
|
return TRUE;
|
|
}
|
|
// otherwise we fall through
|
|
|
|
case PSN_RESET:
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPChooseModeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg*pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
if ( IsStandaloneComputer() || !pWizard->m_bPostXPBuild )
|
|
{
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
|
|
CheckRadioButton( hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2 );
|
|
}
|
|
else if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
CheckRadioButton( hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1 );
|
|
}
|
|
else
|
|
{
|
|
CheckRadioButton( hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2 );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_WIZNEXT:
|
|
{
|
|
// First make sure that we do not come back to this page
|
|
pQuery->dwFlags |= RSOP_NO_WELCOME;
|
|
|
|
// Now get the right mode
|
|
RSOP_QUERY_TYPE QueryType = RSOP_LOGGING_MODE;
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
|
|
{
|
|
QueryType = RSOP_PLANNING_MODE;
|
|
}
|
|
|
|
if ( pQuery->QueryType != QueryType )
|
|
{
|
|
// First free any mode related information in the object
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
pWizard->FreeUserData();
|
|
pWizard->FreeComputerData();
|
|
}
|
|
|
|
ChangeRSOPQueryType( pQuery, QueryType );
|
|
}
|
|
|
|
if ( QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
// Skip to the planning mode pages
|
|
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;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPGetCompDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_LOGGING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
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);
|
|
LocalFree( 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;
|
|
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
DWORD dwWizBack = PSWIZB_BACK;
|
|
if ( pWizard->m_bNoChooseQuery )
|
|
{
|
|
dwWizBack = 0;
|
|
}
|
|
|
|
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), dwWizBack | PSWIZB_NEXT);
|
|
}
|
|
else
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), dwWizBack);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), dwWizBack | PSWIZB_NEXT);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_WIZBACK:
|
|
if ( (pQuery->dwFlags & RSOP_FIX_QUERYTYPE) == RSOP_FIX_QUERYTYPE )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WELCOME);
|
|
}
|
|
else
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_CHOOSEMODE);
|
|
}
|
|
return TRUE;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
LPTSTR szNewComputerName = NULL;
|
|
if (IsDlgButtonChecked (hDlg, IDC_RADIO2) == BST_CHECKED)
|
|
{
|
|
GetControlText(hDlg, IDC_EDIT1, szNewComputerName, TRUE );
|
|
|
|
if ( szNewComputerName != NULL )
|
|
{
|
|
TCHAR* szNormalizedComputerName;
|
|
|
|
// We need to handle the case where the user enters a name
|
|
// prefixed by '\\'
|
|
|
|
szNormalizedComputerName = NormalizedComputerName( szNewComputerName );
|
|
|
|
// If we detect the '\\' prefix, we must remove it since this syntax
|
|
// is not recognized by the RSoP provider
|
|
if ( szNormalizedComputerName != szNewComputerName )
|
|
{
|
|
LPTSTR szReplaceComputerName;
|
|
HRESULT hr;
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(szNormalizedComputerName)+1;
|
|
szReplaceComputerName = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
|
|
if ( szReplaceComputerName != NULL )
|
|
{
|
|
hr = StringCchCopy( szReplaceComputerName, ulNoChars, szNormalizedComputerName );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
|
|
LocalFree( szNewComputerName );
|
|
|
|
szNewComputerName = szReplaceComputerName;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ULONG ulNoChars = 2;
|
|
HRESULT hr;
|
|
|
|
szNewComputerName = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
if ( szNewComputerName != NULL )
|
|
{
|
|
hr = StringCchCopy( szNewComputerName, ulNoChars, L"." );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
}
|
|
|
|
BOOL bComputerNameChanged = FALSE;
|
|
if ( pQuery->szComputerName != NULL )
|
|
{
|
|
if ( szNewComputerName && ( lstrcmpi( pQuery->szComputerName, szNewComputerName ) != 0 ) )
|
|
{
|
|
LocalFree( pQuery->szComputerName );
|
|
pQuery->szComputerName = szNewComputerName;
|
|
bComputerNameChanged = TRUE;
|
|
}
|
|
else
|
|
{
|
|
LocalFree( szNewComputerName );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pQuery->szComputerName = szNewComputerName;
|
|
bComputerNameChanged = TRUE;
|
|
}
|
|
|
|
if ( pWizard->TestAndValidateComputer (hDlg) )
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
|
|
if ( ((pQuery->dwFlags & RSOP_FIX_USER) != RSOP_FIX_USER)
|
|
&& bComputerNameChanged )
|
|
{
|
|
if ( pQuery->szUserName != NULL )
|
|
{
|
|
LocalFree( pQuery->szUserName );
|
|
pQuery->szUserName = NULL;
|
|
}
|
|
|
|
if ( pQuery->szUserSid != NULL )
|
|
{
|
|
LocalFree( pQuery->szUserSid );
|
|
pQuery->szUserSid = NULL;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
}
|
|
|
|
if (IsDlgButtonChecked (hDlg, IDC_CHECK1) == BST_CHECKED)
|
|
{
|
|
pQuery->dwFlags |= RSOP_NO_COMPUTER_POLICY;
|
|
}
|
|
else
|
|
{
|
|
pQuery->dwFlags = pQuery->dwFlags & (RSOP_NO_COMPUTER_POLICY ^ 0xffffffff);
|
|
}
|
|
}
|
|
return TRUE;
|
|
|
|
case PSN_SETACTIVE:
|
|
{
|
|
if ( (pQuery->dwFlags & RSOP_FIX_COMPUTER) == RSOP_FIX_COMPUTER )
|
|
{
|
|
CheckRadioButton( hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2 );
|
|
EnableWindow( GetDlgItem( hDlg, IDC_RADIO1 ), FALSE );
|
|
SetDlgItemText( hDlg, IDC_EDIT1, pQuery->szComputerName );
|
|
CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CHECK1), FALSE);
|
|
}
|
|
else
|
|
{
|
|
if ( (pQuery->szComputerName != NULL) && (lstrcmpi( pQuery->szComputerName, L"." ) != 0) )
|
|
{
|
|
CheckRadioButton( hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2 );
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), TRUE);
|
|
SetDlgItemText( hDlg, IDC_EDIT1, pQuery->szComputerName );
|
|
SetFocus (GetDlgItem(hDlg, IDC_EDIT1));
|
|
}
|
|
else
|
|
{
|
|
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), FALSE);
|
|
SetDlgItemText( hDlg, IDC_EDIT1, _T("") );
|
|
SetFocus (GetDlgItem(hDlg, IDC_RADIO1));
|
|
}
|
|
|
|
if ( (pQuery->dwFlags & RSOP_NO_USER_POLICY) == RSOP_NO_USER_POLICY )
|
|
{
|
|
pQuery->dwFlags = pQuery->dwFlags & (RSOP_NO_COMPUTER_POLICY ^ 0xffffffff);
|
|
CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CHECK1), FALSE);
|
|
}
|
|
else if ( (pQuery->dwFlags & RSOP_NO_COMPUTER_POLICY) == RSOP_NO_COMPUTER_POLICY )
|
|
{
|
|
CheckDlgButton (hDlg, IDC_CHECK1, BST_CHECKED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CHECK1), TRUE);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton (hDlg, IDC_CHECK1, BST_UNCHECKED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CHECK1), TRUE);
|
|
}
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
|
|
|
|
case PSN_RESET:
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPGetUserDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_LOGGING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
LVCOLUMN lvcol;
|
|
RECT rect;
|
|
HWND hLV = GetDlgItem(hDlg, IDC_LIST1);
|
|
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_WIZNEXT:
|
|
case PSN_WIZBACK:
|
|
{
|
|
LPTSTR lpData;
|
|
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
|
|
INT iSel;
|
|
|
|
|
|
if ( (pQuery->dwFlags & RSOP_FIX_USER) != RSOP_FIX_USER )
|
|
{
|
|
if ( pQuery->szUserName != NULL )
|
|
{
|
|
LocalFree( pQuery->szUserName );
|
|
pQuery->szUserName = NULL;
|
|
}
|
|
|
|
if ( pQuery->szUserSid != NULL )
|
|
{
|
|
LocalFree( pQuery->szUserSid );
|
|
pQuery->szUserSid = NULL;
|
|
}
|
|
|
|
if (IsDlgButtonChecked (hDlg, IDC_RADIO4) == BST_CHECKED)
|
|
{
|
|
pQuery->dwFlags |= RSOP_NO_USER_POLICY;
|
|
}
|
|
else
|
|
{
|
|
pQuery->dwFlags = pQuery->dwFlags & (RSOP_NO_USER_POLICY ^ 0xffffffff);
|
|
|
|
if (IsDlgButtonChecked (hDlg, IDC_RADIO1))
|
|
{
|
|
LPTSTR lpTemp;
|
|
|
|
if ( IsStandaloneComputer() )
|
|
{
|
|
pQuery->szUserName = MyGetUserName (NameUnknown);
|
|
}
|
|
else
|
|
{
|
|
pQuery->szUserName = MyGetUserName (NameSamCompatible);
|
|
}
|
|
|
|
HRESULT hr;
|
|
ULONG ulNoChars = 2;
|
|
|
|
pQuery->szUserSid = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
|
|
if ( pQuery->szUserSid != NULL )
|
|
{
|
|
hr = StringCchCopy( pQuery->szUserSid, ulNoChars, TEXT(".") );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
iSel = (INT) SendMessage(hList, LVM_GETNEXTITEM, (WPARAM) -1, MAKELPARAM(LVNI_SELECTED, 0));
|
|
|
|
if (iSel != -1)
|
|
{
|
|
pQuery->szUserName = (TCHAR*)LocalAlloc( LPTR, 200 * sizeof(TCHAR) );
|
|
if ( pQuery->szUserName != NULL )
|
|
{
|
|
LVITEM item;
|
|
|
|
ZeroMemory (&item, sizeof(item));
|
|
|
|
item.mask = LVIF_TEXT | LVIF_PARAM;
|
|
item.iItem = iSel;
|
|
item.pszText = pQuery->szUserName;
|
|
item.cchTextMax = 200;
|
|
|
|
if (SendMessage(hList, LVM_GETITEM, 0, (LPARAM) &item))
|
|
{
|
|
|
|
lpData = (LPTSTR) item.lParam;
|
|
|
|
if (lpData)
|
|
{
|
|
ULONG ulNoChars;
|
|
HRESULT hr;
|
|
|
|
ulNoChars = lstrlen(lpData) + 1;
|
|
pQuery->szUserSid = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
if ( pQuery->szUserSid != NULL )
|
|
{
|
|
hr = StringCchCopy( pQuery->szUserSid, ulNoChars, lpData );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} // if (IsDlgButtonChecked (hDlg, IDC_RADIO1))
|
|
}
|
|
|
|
}
|
|
if ( ((NMHDR FAR*)lParam)->code == PSN_WIZNEXT )
|
|
{
|
|
// Skip to the last page in the wizard
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lLoggingFinishedPage);
|
|
return TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
{
|
|
HRESULT hr;
|
|
BOOL bFixedUserFound;
|
|
BOOL bCurrentUserFound;
|
|
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
|
|
SendMessage(hList, LVM_DELETEALLITEMS, 0 ,0);
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
hr = pWizard->FillUserList (hList, &bCurrentUserFound, &bFixedUserFound);
|
|
if ( FAILED(hr) )
|
|
{
|
|
ReportError (hDlg, hr, IDS_ENUMUSERSFAILED);
|
|
// RsopEnumerateUsers failed. It should be safe to disable user policy setting in all cases
|
|
pQuery->dwFlags |= RSOP_NO_USER_POLICY;
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), FALSE);
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), FALSE);
|
|
}
|
|
else if ( (pQuery->dwFlags & RSOP_FIX_USER) == RSOP_FIX_USER )
|
|
{
|
|
if ( bFixedUserFound )
|
|
{
|
|
// Disable current user radio button
|
|
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), FALSE);
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// If there is no computer policy, then we should at least have user policy, so disable
|
|
if ( (pQuery->dwFlags & RSOP_NO_COMPUTER_POLICY) == RSOP_NO_COMPUTER_POLICY )
|
|
{
|
|
pQuery->dwFlags = pQuery->dwFlags & (RSOP_NO_USER_POLICY ^ 0xffffffff);
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
|
|
}
|
|
else if ( ((pQuery->dwFlags & RSOP_NO_USER_POLICY) == RSOP_NO_USER_POLICY)
|
|
|| (ListView_GetItemCount (hList) == 0) )
|
|
{
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
|
|
}
|
|
else
|
|
{
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
|
|
}
|
|
|
|
if ( (!lstrcmpi( pQuery->szComputerName, TEXT("."))) && bCurrentUserFound )
|
|
{
|
|
pWizard->m_bNoCurrentUser = FALSE;
|
|
}
|
|
else
|
|
{
|
|
pWizard->m_bNoCurrentUser = TRUE;
|
|
}
|
|
|
|
if ( (pQuery->szUserSid != NULL)
|
|
&& !lstrcmpi( pQuery->szUserSid, TEXT("."))
|
|
&& !pWizard->m_bNoCurrentUser )
|
|
{
|
|
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
|
|
}
|
|
else if ( (pQuery->szUserSid == NULL) && !pWizard->m_bNoCurrentUser )
|
|
{
|
|
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
|
|
}
|
|
else if ( ListView_GetItemCount (hList) != 0 )
|
|
{
|
|
CheckRadioButton (hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
|
|
|
|
if ( pQuery->szUserName != NULL )
|
|
{
|
|
LVFINDINFO FindInfo;
|
|
LVITEM item;
|
|
INT iRet;
|
|
|
|
ZeroMemory (&FindInfo, sizeof(FindInfo));
|
|
FindInfo.flags = LVFI_STRING;
|
|
FindInfo.psz = pQuery->szUserName;
|
|
|
|
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
|
|
{
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO1), FALSE);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), FALSE);
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), 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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
if ( (pQuery->dwFlags & RSOP_FIX_USER) == RSOP_FIX_USER )
|
|
{
|
|
break;
|
|
}
|
|
|
|
int iListCount = ListView_GetItemCount(GetDlgItem(hDlg, IDC_LIST1));
|
|
|
|
if (IsDlgButtonChecked (hDlg, IDC_RADIO4) == BST_CHECKED)
|
|
{
|
|
// Disable list of users while "Do not display user policy" radio is selected
|
|
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_RADIO1), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_RADIO2), FALSE);
|
|
|
|
if ( pWizard->m_bNoCurrentUser && (iListCount == 0)
|
|
&& ( (pQuery->dwFlags & RSOP_NO_COMPUTER_POLICY) == RSOP_NO_COMPUTER_POLICY ) )
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
|
|
}
|
|
else
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Enable/disable inner radio buttons
|
|
EnableWindow(GetDlgItem(hDlg, IDC_RADIO1), !pWizard->m_bNoCurrentUser);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_RADIO2), iListCount != 0);
|
|
|
|
if ( !pWizard->m_bNoCurrentUser || (iListCount != 0) )
|
|
{
|
|
if ( (pQuery->dwFlags & RSOP_NO_COMPUTER_POLICY) == RSOP_NO_COMPUTER_POLICY )
|
|
{
|
|
pQuery->dwFlags = pQuery->dwFlags & (RSOP_NO_USER_POLICY ^ 0xffffffff);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), FALSE);
|
|
|
|
}
|
|
else
|
|
{
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO4), TRUE);
|
|
}
|
|
|
|
if (IsDlgButtonChecked (hDlg, IDC_RADIO2) == BST_CHECKED)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), TRUE);
|
|
|
|
if ( iListCount != 0 )
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
SetFocus (GetDlgItem(hDlg, IDC_LIST1));
|
|
}
|
|
else
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_LIST1), FALSE);
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( (pQuery->dwFlags & RSOP_NO_COMPUTER_POLICY) == RSOP_NO_COMPUTER_POLICY )
|
|
{
|
|
// If the user said no computer data but he has access to no users,
|
|
// enable on back button and disable the checkbox
|
|
pQuery->dwFlags = pQuery->dwFlags & (RSOP_NO_USER_POLICY ^ 0xffffffff);
|
|
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO3);
|
|
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);
|
|
CheckRadioButton(hDlg, IDC_RADIO3, IDC_RADIO4, IDC_RADIO4);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), FALSE);
|
|
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPGetTargetDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
LPTSTR lpText, lpPath;
|
|
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
if ( pWizard != NULL )
|
|
{
|
|
lpText = MyGetUserName(NameSamCompatible);
|
|
|
|
if (lpText)
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT6, lpText);
|
|
LocalFree (lpText);
|
|
}
|
|
|
|
lpText = MyGetUserName(NameFullyQualifiedDN);
|
|
|
|
if (lpText)
|
|
{
|
|
lpPath = pWizard->GetDefaultSOM(lpText);
|
|
|
|
if (lpPath)
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT5, lpPath);
|
|
delete [] lpPath;
|
|
}
|
|
|
|
LocalFree (lpText);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_RADIO1:
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), TRUE);
|
|
if ( pQuery->pUser->szSOM != NULL )
|
|
{
|
|
SetDlgItemText( hDlg, IDC_EDIT1, pQuery->pUser->szSOM );
|
|
}
|
|
|
|
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);
|
|
if ( pQuery->pUser->szName != NULL )
|
|
{
|
|
SetDlgItemText( hDlg, IDC_EDIT2, pQuery->pUser->szName );
|
|
}
|
|
|
|
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);
|
|
if ( pQuery->pComputer->szSOM != NULL )
|
|
{
|
|
SetDlgItemText( hDlg, IDC_EDIT3, pQuery->pComputer->szSOM );
|
|
}
|
|
|
|
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);
|
|
if ( pQuery->pComputer->szName != NULL )
|
|
{
|
|
// RM: The computer name account in the DS actually has a '$' at the end. We strip it here for display
|
|
// purposes, but will add it again ...
|
|
if ( (wcslen(pQuery->pComputer->szName) >= 1)
|
|
&& (pQuery->pComputer->szName[wcslen(pQuery->pComputer->szName)-1] == L'$') )
|
|
{
|
|
pWizard->m_bDollarRemoved = TRUE;
|
|
pQuery->pComputer->szName[wcslen(pQuery->pComputer->szName)-1] = L'\0';
|
|
}
|
|
SetDlgItemText(hDlg, IDC_EDIT4, pQuery->pComputer->szName );
|
|
if ( pWizard->m_bDollarRemoved )
|
|
{
|
|
pQuery->pComputer->szName[wcslen(pQuery->pComputer->szName)] = L'$';
|
|
pWizard->m_bDollarRemoved = FALSE;
|
|
}
|
|
}
|
|
|
|
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))
|
|
{
|
|
LPWSTR szDN;
|
|
HRESULT hr;
|
|
|
|
// skipping 7 chars for LDAP:// in the szResult
|
|
hr = UnEscapeLdapPath(szResult+7, &szDN);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
|
|
}
|
|
else {
|
|
SetDlgItemText(hDlg, IDC_EDIT1, szDN);
|
|
LocalFree(szDN);
|
|
}
|
|
}
|
|
|
|
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);
|
|
LocalFree( 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))
|
|
{
|
|
LPWSTR szDN;
|
|
HRESULT hr;
|
|
|
|
// skipping 7 chars for LDAP:// in the szResult
|
|
hr = UnEscapeLdapPath(szResult+7, &szDN);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
|
|
}
|
|
else {
|
|
SetDlgItemText(hDlg, IDC_EDIT3, szDN);
|
|
LocalFree(szDN);
|
|
}
|
|
}
|
|
|
|
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);
|
|
LocalFree( sz );
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_REFRESHDISPLAY:
|
|
{
|
|
UINT n;
|
|
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
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);
|
|
}
|
|
|
|
DWORD dwWizBack = PSWIZB_BACK;
|
|
if ( pWizard->m_bNoChooseQuery )
|
|
{
|
|
dwWizBack = 0;
|
|
}
|
|
|
|
if (n > 0 )
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), dwWizBack | PSWIZB_NEXT);
|
|
}
|
|
else
|
|
{
|
|
PropSheet_SetWizButtons(GetParent(hDlg), dwWizBack);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
{
|
|
// RM: Fill dialog with current user values
|
|
if ( pQuery->pUser->szName != NULL )
|
|
{
|
|
CheckDlgButton (hDlg, IDC_RADIO2, BST_CHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT2, pQuery->pUser->szName);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), TRUE);
|
|
|
|
CheckDlgButton (hDlg, IDC_RADIO1, BST_UNCHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT1, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), FALSE);
|
|
}
|
|
else if ( pQuery->pUser->szSOM != NULL )
|
|
{
|
|
CheckDlgButton (hDlg, IDC_RADIO1, BST_CHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT1, pQuery->pUser->szSOM);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), TRUE);
|
|
|
|
CheckDlgButton (hDlg, IDC_RADIO2, BST_UNCHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT2, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton (hDlg, IDC_RADIO1, BST_CHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT1, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), TRUE);
|
|
|
|
CheckDlgButton (hDlg, IDC_RADIO2, BST_UNCHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT2, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
|
|
}
|
|
|
|
// Disable certain items if the user must remain fixed
|
|
if ( (pQuery->dwFlags & RSOP_FIX_USER) == RSOP_FIX_USER )
|
|
{
|
|
EnableWindow (GetDlgItem (hDlg, IDC_RADIO1), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_RADIO2), FALSE);
|
|
if ( pQuery->pUser->szName != NULL )
|
|
{
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT2), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE2), FALSE);
|
|
}
|
|
else if ( pQuery->pUser->szSOM != NULL )
|
|
{
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT1), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE1), FALSE);
|
|
}
|
|
}
|
|
|
|
// RM: Fill dialog with current computer values
|
|
if ( pQuery->pComputer->szName != NULL )
|
|
{
|
|
CheckDlgButton (hDlg, IDC_RADIO4, BST_CHECKED);
|
|
// RM: The computer name account in the DS actually has a '$' at the end. We strip it here for display
|
|
// purposes, but will add it again ...
|
|
if ( (wcslen(pQuery->pComputer->szName) >= 1)
|
|
&& (pQuery->pComputer->szName[wcslen(pQuery->pComputer->szName)-1] == L'$') )
|
|
{
|
|
pWizard->m_bDollarRemoved = TRUE;
|
|
pQuery->pComputer->szName[wcslen(pQuery->pComputer->szName)-1] = L'\0';
|
|
}
|
|
SetDlgItemText(hDlg, IDC_EDIT4, pQuery->pComputer->szName );
|
|
if ( pWizard->m_bDollarRemoved )
|
|
{
|
|
pQuery->pComputer->szName[wcslen(pQuery->pComputer->szName)] = L'$';
|
|
pWizard->m_bDollarRemoved = FALSE;
|
|
}
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), TRUE);
|
|
|
|
CheckDlgButton (hDlg, IDC_RADIO3, BST_UNCHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT3, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE3), FALSE);
|
|
}
|
|
else if ( pQuery->pComputer->szSOM != NULL )
|
|
{
|
|
CheckDlgButton (hDlg, IDC_RADIO3, BST_CHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT3, pQuery->pComputer->szSOM);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE3), TRUE);
|
|
|
|
CheckDlgButton (hDlg, IDC_RADIO4, BST_UNCHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT4, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton (hDlg, IDC_RADIO3, BST_CHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT3, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), TRUE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE3), TRUE);
|
|
|
|
CheckDlgButton (hDlg, IDC_RADIO4, BST_UNCHECKED);
|
|
SetDlgItemText(hDlg, IDC_EDIT4, _T(""));
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
|
|
}
|
|
|
|
// Disable certain items if the computer must remain fixed
|
|
if ( (pQuery->dwFlags & RSOP_FIX_COMPUTER) == RSOP_FIX_COMPUTER )
|
|
{
|
|
EnableWindow (GetDlgItem (hDlg, IDC_RADIO3), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_RADIO4), FALSE);
|
|
if ( pQuery->pComputer->szName != NULL )
|
|
{
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT4), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE4), FALSE);
|
|
}
|
|
else if ( pQuery->pComputer->szSOM != NULL )
|
|
{
|
|
EnableWindow (GetDlgItem (hDlg, IDC_EDIT3), FALSE);
|
|
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE3), FALSE);
|
|
}
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
if ( (pQuery->dwFlags & RSOP_FIX_QUERYTYPE) == RSOP_FIX_QUERYTYPE )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WELCOME);
|
|
}
|
|
else
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_CHOOSEMODE);
|
|
}
|
|
return TRUE;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
HRESULT hr;
|
|
IDirectoryObject * pUserObject = NULL;
|
|
IDirectoryObject * pComputerObject = NULL;
|
|
LPTSTR lpUserName = NULL, lpUserSOM = NULL;
|
|
LPTSTR lpComputerName = NULL, lpComputerSOM = NULL;
|
|
LPTSTR lpFullName;
|
|
|
|
BOOL bUserChanged = TRUE;
|
|
BOOL bComputerChanged = TRUE;
|
|
|
|
SetWaitCursor();
|
|
|
|
// Get the user and dn name
|
|
if (IsDlgButtonChecked(hDlg, IDC_RADIO1) == BST_CHECKED)
|
|
{
|
|
GetControlText(hDlg, IDC_EDIT1, lpUserSOM, FALSE);
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
pWizard->EscapeString (&lpUserSOM);
|
|
|
|
hr = pWizard->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, FALSE);
|
|
|
|
if ( lpUserName )
|
|
{
|
|
lpUserSOM = ConvertName(lpUserName);
|
|
if (lpUserName && !lpUserSOM)
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPWizardDlg::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;
|
|
}
|
|
|
|
pWizard->EscapeString (&lpUserSOM);
|
|
}
|
|
}
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(lpUserSOM) + 10;
|
|
lpFullName = (LPTSTR) LocalAlloc (LPTR, ulNoChars * sizeof(TCHAR));
|
|
|
|
if (lpFullName)
|
|
{
|
|
hr = StringCchCopy (lpFullName, ulNoChars, TEXT("LDAP://"));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat (lpFullName, ulNoChars, lpUserSOM);
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
|
|
hr = OpenDSObject(lpFullName, IID_IDirectoryObject, (void**)&pUserObject);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPWizardDlg::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, FALSE);
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
pWizard->EscapeString (&lpComputerSOM);
|
|
|
|
hr = pWizard->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();
|
|
pUserObject = NULL;
|
|
}
|
|
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GetControlText(hDlg, IDC_EDIT4, lpComputerName, FALSE );
|
|
|
|
if (lpComputerName)
|
|
{
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(lpComputerName) + 2;
|
|
LPTSTR lpTempName = new TCHAR [ulNoChars];
|
|
|
|
if (lpTempName)
|
|
{
|
|
hr = StringCchCopy (lpTempName, ulNoChars, lpComputerName);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat (lpTempName, ulNoChars, TEXT("$"));
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
lpComputerSOM = ConvertName(lpTempName);
|
|
delete [] lpComputerName;
|
|
lpComputerName = lpTempName;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lpComputerName && !lpComputerSOM)
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPWizardDlg::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();
|
|
pUserObject = NULL;
|
|
}
|
|
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->EscapeString (&lpComputerSOM);
|
|
}
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(lpComputerSOM) + 10;
|
|
lpFullName = (LPTSTR) LocalAlloc (LPTR, ulNoChars * sizeof(TCHAR));
|
|
|
|
if (lpFullName)
|
|
{
|
|
hr = StringCchCopy (lpFullName, ulNoChars, TEXT("LDAP://"));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat (lpFullName, ulNoChars, lpComputerSOM);
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = OpenDSObject(lpFullName, IID_IDirectoryObject, (void**)&pComputerObject);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPWizardDlg::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();
|
|
pUserObject = NULL;
|
|
}
|
|
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
|
|
LocalFree (lpFullName);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Now check that both user and computer are in the same forest
|
|
if ( (lpUserSOM != NULL) && (lpComputerSOM != NULL) )
|
|
{
|
|
LPTSTR szComputerForest( NULL );
|
|
LPTSTR szUserForest( NULL );
|
|
BOOL bDifferentForests( FALSE );
|
|
|
|
hr = GetForestFromContainer( lpUserSOM, &szUserForest );
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
hr = GetForestFromContainer( lpComputerSOM, &szComputerForest );
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
if ( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE, szComputerForest, -1,
|
|
szUserForest, -1 ) != CSTR_EQUAL )
|
|
{
|
|
bDifferentForests = TRUE;
|
|
hr = E_INVALIDARG;
|
|
}
|
|
LocalFree( szComputerForest );
|
|
}
|
|
LocalFree( szUserForest );
|
|
}
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
if ( bDifferentForests )
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOCROSSFORESTALLOWED);
|
|
}
|
|
else
|
|
{
|
|
ReportError (hDlg, hr, IDS_CROSSFORESTFAILED);
|
|
}
|
|
|
|
if (lpComputerName)
|
|
{
|
|
delete [] lpComputerName;
|
|
}
|
|
delete [] lpComputerSOM;
|
|
|
|
if (lpUserName)
|
|
{
|
|
delete [] lpUserName;
|
|
}
|
|
delete [] lpUserSOM;
|
|
|
|
if (pUserObject)
|
|
{
|
|
pUserObject->Release();
|
|
pUserObject = NULL;
|
|
}
|
|
|
|
if (pComputerObject)
|
|
{
|
|
pComputerObject->Release();
|
|
pComputerObject = NULL;
|
|
}
|
|
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// Store the user information
|
|
if ( (pQuery->pUser->szName != NULL) && (lpUserName != NULL) && (!lstrcmpi(pQuery->pUser->szName, lpUserName)))
|
|
{
|
|
bUserChanged = FALSE;
|
|
|
|
// Just reinitialize and reuse what we might need
|
|
if ( pWizard->m_szDefaultUserSOM == NULL )
|
|
{
|
|
pWizard->m_szDefaultUserSOM = pWizard->GetDefaultSOM (lpUserSOM);
|
|
}
|
|
if ( pWizard->m_pUserObject == NULL )
|
|
{
|
|
pWizard->m_pUserObject = pUserObject;
|
|
pUserObject = NULL;
|
|
}
|
|
|
|
// Now delete the unneeded stuff
|
|
delete [] lpUserName;
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
delete [] lpUserSOM;
|
|
}
|
|
|
|
if (pUserObject)
|
|
{
|
|
pUserObject->Release();
|
|
pUserObject = NULL;
|
|
}
|
|
}
|
|
else if ( (pQuery->pUser->szName == NULL) && (lpUserName == NULL)
|
|
&& (pQuery->pUser->szSOM != NULL) && (lpUserSOM != NULL)
|
|
&& (!lstrcmpi( pQuery->pUser->szSOM, lpUserSOM)))
|
|
{
|
|
bUserChanged = FALSE;
|
|
|
|
// Just reinitialize and reuse what we might need
|
|
if ( pWizard->m_szDefaultUserSOM == NULL )
|
|
{
|
|
pWizard->m_szDefaultUserSOM = pWizard->GetDefaultSOM (lpUserSOM);
|
|
}
|
|
if ( pWizard->m_pUserObject == NULL )
|
|
{
|
|
pWizard->m_pUserObject = pUserObject;
|
|
pUserObject = NULL;
|
|
}
|
|
|
|
// Now delete the unneeded stuff
|
|
delete [] lpUserSOM;
|
|
if (pUserObject)
|
|
{
|
|
pUserObject->Release();
|
|
}
|
|
}
|
|
else if ( (pQuery->pUser->szName == NULL) && (lpUserName == NULL)
|
|
&& (pQuery->pUser->szSOM == NULL) && (lpUserSOM == NULL) )
|
|
{
|
|
bUserChanged = FALSE;
|
|
// No stuff to delete!
|
|
}
|
|
else
|
|
{
|
|
pWizard->FreeUserData();
|
|
|
|
if ( lpUserName != NULL )
|
|
{
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(lpUserName)+1;
|
|
pQuery->pUser->szName = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
if ( pQuery->pUser->szName != NULL )
|
|
{
|
|
hr = StringCchCopy( pQuery->pUser->szName, ulNoChars, lpUserName );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
delete [] lpUserName;
|
|
|
|
pWizard->m_szDefaultUserSOM = pWizard->GetDefaultSOM (lpUserSOM);
|
|
delete [] lpUserSOM;
|
|
}
|
|
else if ( lpUserSOM != NULL )
|
|
{
|
|
pQuery->pUser->szSOM = NULL;
|
|
(void)UnEscapeLdapPath(lpUserSOM, &(pQuery->pUser->szSOM));
|
|
|
|
delete [] lpUserSOM;
|
|
}
|
|
|
|
pWizard->m_pUserObject = pUserObject;
|
|
}
|
|
|
|
|
|
// Store the computer information
|
|
if ( (pQuery->pComputer->szName != NULL) && (lpComputerName != NULL) && !lstrcmpi(pQuery->pComputer->szName, lpComputerName) )
|
|
{
|
|
bComputerChanged = FALSE;
|
|
|
|
// Just reinitialize and reuse what we might need
|
|
if ( pWizard->m_szDefaultComputerSOM == NULL )
|
|
{
|
|
pWizard->m_szDefaultComputerSOM = pWizard->GetDefaultSOM (lpComputerSOM);
|
|
}
|
|
if ( pWizard->m_pComputerObject== NULL )
|
|
{
|
|
pWizard->m_pComputerObject = pComputerObject;
|
|
pComputerObject = NULL;
|
|
}
|
|
|
|
// Now delete the unneeded stuff
|
|
delete [] lpComputerName;
|
|
if (lpComputerSOM)
|
|
{
|
|
delete [] lpComputerSOM;
|
|
}
|
|
|
|
if (pComputerObject)
|
|
{
|
|
pComputerObject->Release();
|
|
pComputerObject = NULL;
|
|
}
|
|
}
|
|
else if ( (pQuery->pComputer->szName == NULL) && (lpComputerName == NULL)
|
|
&& (pQuery->pComputer->szSOM != NULL) && (lpComputerSOM != NULL)
|
|
&& !lstrcmpi(pQuery->pComputer->szSOM, lpComputerSOM) )
|
|
{
|
|
bComputerChanged = FALSE;
|
|
|
|
// Just reinitialize and reuse what we might need
|
|
if ( pWizard->m_szDefaultComputerSOM == NULL )
|
|
{
|
|
pWizard->m_szDefaultComputerSOM = pWizard->GetDefaultSOM (lpComputerSOM);
|
|
}
|
|
if ( pWizard->m_pComputerObject== NULL )
|
|
{
|
|
pWizard->m_pComputerObject = pComputerObject;
|
|
pComputerObject = NULL;
|
|
}
|
|
|
|
// Now delete the unneeded stuff
|
|
delete [] lpComputerSOM;
|
|
|
|
if (pComputerObject)
|
|
{
|
|
pComputerObject->Release();
|
|
pComputerObject = NULL;
|
|
}
|
|
}
|
|
else if ( (pQuery->pComputer->szName == NULL) && (lpComputerName == NULL)
|
|
&& (pQuery->pComputer->szSOM == NULL) && (lpComputerSOM == NULL) )
|
|
{
|
|
bComputerChanged = FALSE;
|
|
// No stuff to delete!
|
|
}
|
|
else
|
|
{
|
|
pWizard->FreeComputerData ();
|
|
|
|
if ( lpComputerName != NULL )
|
|
{
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(lpComputerName)+1;
|
|
pQuery->pComputer->szName = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
if ( pQuery->pComputer->szName != NULL )
|
|
{
|
|
hr = StringCchCopy( pQuery->pComputer->szName, ulNoChars, lpComputerName );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
delete [] lpComputerName;
|
|
|
|
pWizard->m_szDefaultComputerSOM = pWizard->GetDefaultSOM (lpComputerSOM);
|
|
delete [] lpComputerSOM;
|
|
}
|
|
else if ( lpComputerSOM != NULL )
|
|
{
|
|
pQuery->pComputer->szSOM = NULL;
|
|
(void)UnEscapeLdapPath(lpComputerSOM, &(pQuery->pComputer->szSOM));
|
|
|
|
delete [] lpComputerSOM;
|
|
}
|
|
|
|
pWizard->m_pComputerObject = pComputerObject;
|
|
}
|
|
|
|
if ( (pQuery->dwFlags & RSOP_FIX_SITENAME) == RSOP_FIX_SITENAME )
|
|
{
|
|
LPTSTR szSiteFriendly = NULL;
|
|
if ( GetSiteFriendlyName( pQuery->szSite, &szSiteFriendly ) )
|
|
{
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(szSiteFriendly)+1;
|
|
LocalFree( pQuery->szSite );
|
|
pQuery->szSite = (TCHAR*)LocalAlloc( LPTR, ulNoChars * sizeof(TCHAR) );
|
|
if ( pQuery->szSite != NULL )
|
|
{
|
|
hr = StringCchCopy( pQuery->szSite, ulNoChars, szSiteFriendly );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
delete [] szSiteFriendly;
|
|
}
|
|
}
|
|
// RM-TODO: Do not delete site name if it is already set and ? didn't change. First find out what ? is!
|
|
else if ( (bComputerChanged || bUserChanged) && (pQuery->szSite != NULL) )
|
|
{
|
|
LocalFree( pQuery->szSite );
|
|
pQuery->szSite = NULL;
|
|
}
|
|
|
|
if ( bUserChanged || bComputerChanged || (pQuery->szDomainController == NULL) )
|
|
{
|
|
// Set pQuery->szDomainController to the primary DC
|
|
LPTSTR szDomain = NULL;
|
|
|
|
// Determine the focused domain so we can focus on the correct DC.
|
|
if ( pQuery->pComputer->szName != NULL )
|
|
{
|
|
// Try and get the computer's domain
|
|
szDomain = ExtractDomain( pQuery->pComputer->szName );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (pQuery->pComputer->szSOM != NULL) )
|
|
{
|
|
// Try and get the computer's domain from the SOM
|
|
szDomain = GetDomainFromSOM( pQuery->pComputer->szSOM );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (pQuery->pUser->szName != NULL) )
|
|
{
|
|
// Try and get the user's domain
|
|
szDomain = ExtractDomain( pQuery->pUser->szName );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (pQuery->pUser->szSOM != NULL) )
|
|
{
|
|
// Try and get the user's domain from the SOM
|
|
szDomain = GetDomainFromSOM( pQuery->pUser->szSOM );
|
|
}
|
|
|
|
if ( szDomain == NULL )
|
|
{
|
|
// Use the local domain
|
|
LPTSTR szName;
|
|
szName = MyGetUserName(NameSamCompatible);
|
|
if ( szName != NULL )
|
|
{
|
|
szDomain = ExtractDomain(szName);
|
|
LocalFree( szName );
|
|
}
|
|
}
|
|
|
|
// RM: This is a hack! The command line parameter passed as the preferred DC is being used lower down
|
|
// in this method as a parameter to GetDCName - this is the only known place where it is used.
|
|
LPTSTR szInheritServer = NULL;
|
|
if ( (pQuery->dwFlags & RSOP_FIX_DC) == RSOP_FIX_DC )
|
|
{
|
|
szInheritServer = pQuery->szDomainController;
|
|
pQuery->szDomainController = NULL;
|
|
}
|
|
|
|
if ( pQuery->szDomainController != NULL )
|
|
{
|
|
LocalFree( pQuery->szDomainController );
|
|
pQuery->szDomainController = NULL;
|
|
}
|
|
|
|
LPTSTR lpDCName;
|
|
lpDCName = GetDCName (szDomain, szInheritServer, NULL, FALSE, 0, DS_RETURN_DNS_NAME);
|
|
|
|
if ( lpDCName != NULL )
|
|
{
|
|
pQuery->szDomainController = lpDCName;
|
|
lpDCName = NULL;
|
|
}
|
|
|
|
if ( szDomain != NULL )
|
|
{
|
|
delete [] szDomain;
|
|
}
|
|
}
|
|
|
|
// Reset the loopback mode if the computer or user is now empty
|
|
if ( (pQuery->LoopbackMode != RSOP_LOOPBACK_NONE) && (bComputerChanged || bUserChanged) )
|
|
{
|
|
if ( ((pQuery->pComputer->szName == NULL) && (pQuery->pComputer->szSOM == NULL))
|
|
|| ((pQuery->pUser->szName == NULL) && (pQuery->pUser->szSOM == NULL)) )
|
|
pQuery->LoopbackMode = RSOP_LOOPBACK_NONE;
|
|
}
|
|
|
|
ClearWaitCursor();
|
|
}
|
|
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_GETTARGET;
|
|
|
|
// skip to the final pages
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
break;
|
|
|
|
case PSN_WIZFINISH:
|
|
case PSN_RESET:
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
return TRUE;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPGetDCDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
BOOL bEnable;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_CHECK2:
|
|
if (SendMessage (GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0))
|
|
{
|
|
pQuery->LoopbackMode = RSOP_LOOPBACK_REPLACE;
|
|
SendMessage (GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_CHECKED, 0);
|
|
SendMessage (GetDlgItem(hDlg, IDC_RADIO3), BM_SETCHECK, BST_UNCHECKED, 0);
|
|
|
|
bEnable = TRUE;
|
|
if ( (NULL == pQuery->pUser->szName) && (NULL == pQuery->pUser->szSOM) )
|
|
{
|
|
bEnable = FALSE;
|
|
}
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), bEnable);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), bEnable);
|
|
}
|
|
else
|
|
{
|
|
pQuery->LoopbackMode = RSOP_LOOPBACK_NONE;
|
|
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:
|
|
pQuery->LoopbackMode = RSOP_LOOPBACK_REPLACE;
|
|
break;
|
|
case IDC_RADIO3:
|
|
pQuery->LoopbackMode = RSOP_LOOPBACK_MERGE;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
{
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
|
|
SetWaitCursor();
|
|
|
|
if ( pQuery->bSlowNetworkConnection )
|
|
{
|
|
CheckDlgButton(hDlg, IDC_CHECK1, BST_CHECKED);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton(hDlg, IDC_CHECK1, BST_UNCHECKED);
|
|
}
|
|
|
|
pWizard->InitializeSitesInfo (hDlg);
|
|
|
|
if ( (RSOP_LOOPBACK_NONE == pQuery->LoopbackMode)
|
|
|| ( (RSOP_LOOPBACK_MERGE == pQuery->LoopbackMode)
|
|
&& ( ((NULL == pQuery->pUser->szName) && (NULL == pQuery->pUser->szSOM))
|
|
|| ((NULL == pQuery->pComputer->szName) && (NULL == pQuery->pComputer->szSOM)) ) )
|
|
|| ( (RSOP_LOOPBACK_REPLACE == pQuery->LoopbackMode)
|
|
&& (NULL == pQuery->pComputer->szName) && (NULL == pQuery->pComputer->szSOM) ) )
|
|
{
|
|
pQuery->LoopbackMode = RSOP_LOOPBACK_NONE;
|
|
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 == pQuery->pComputer->szName) && (NULL == pQuery->pComputer->szSOM) )
|
|
{
|
|
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
|
|
{
|
|
CheckDlgButton( hDlg, IDC_CHECK2, BST_CHECKED );
|
|
|
|
if ( RSOP_LOOPBACK_REPLACE == pQuery->LoopbackMode )
|
|
{
|
|
SendMessage (GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_CHECKED, 0);
|
|
SendMessage (GetDlgItem(hDlg, IDC_RADIO3), BM_SETCHECK, BST_UNCHECKED, 0);
|
|
}
|
|
else
|
|
{
|
|
SendMessage (GetDlgItem(hDlg, IDC_RADIO2), BM_SETCHECK, BST_UNCHECKED, 0);
|
|
SendMessage (GetDlgItem(hDlg, IDC_RADIO3), BM_SETCHECK, BST_CHECKED, 0);
|
|
}
|
|
|
|
bEnable = TRUE;
|
|
if ( (NULL == pQuery->pUser->szName) && (NULL == pQuery->pUser->szSOM) )
|
|
{
|
|
bEnable = FALSE;
|
|
}
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO2), bEnable);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_RADIO3), bEnable);
|
|
}
|
|
|
|
ClearWaitCursor();
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
case PSN_WIZNEXT:
|
|
{
|
|
SetWaitCursor();
|
|
|
|
GetControlText(hDlg, IDC_COMBO1, pQuery->szSite, TRUE);
|
|
|
|
if ( pQuery->szSite != NULL )
|
|
{
|
|
TCHAR szName[30];
|
|
|
|
LoadString (g_hInstance, IDS_NONE, szName, ARRAYSIZE(szName));
|
|
|
|
if ( !lstrcmpi( pQuery->szSite, szName ) )
|
|
{
|
|
LocalFree( pQuery->szSite );
|
|
pQuery->szSite = NULL;
|
|
}
|
|
}
|
|
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pQuery->bSlowNetworkConnection= TRUE;
|
|
}
|
|
else
|
|
{
|
|
pQuery->bSlowNetworkConnection = FALSE;
|
|
}
|
|
|
|
ClearWaitCursor();
|
|
|
|
if ( ((NMHDR FAR*)lParam)->code == PSN_WIZNEXT )
|
|
{
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_GETDC;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
if ( (NULL == pQuery->pUser->szName) && (NULL == pQuery->pComputer->szName) )
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_GETDC;
|
|
|
|
if ( (pQuery->pUser->szSOM != NULL) || (RSOP_LOOPBACK_NONE!= pQuery->LoopbackMode) )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTUSERSEC);
|
|
}
|
|
else if ( pQuery->pComputer->szSOM != NULL )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_ALTCOMPSEC);
|
|
}
|
|
else
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZFINISH:
|
|
// fall through
|
|
|
|
case PSN_RESET:
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPAltDirsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
DSBROWSEINFO dsbi = {0};
|
|
TCHAR szTitle[256];
|
|
TCHAR szCaption[256];
|
|
TCHAR* szResult;
|
|
dsbi.hwndOwner = hDlg;
|
|
dsbi.pszCaption = szTitle;
|
|
dsbi.pszTitle = szCaption;
|
|
dsbi.cbStruct = sizeof(dsbi);
|
|
dsbi.pszPath = NULL;
|
|
dsbi.cchPath = 0;
|
|
dsbi.dwFlags = DSBI_ENTIREDIRECTORY;
|
|
dsbi.pfnCallback = DsBrowseCallback;
|
|
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_BUTTON1:
|
|
// browse for user's OU
|
|
|
|
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))
|
|
{
|
|
LPWSTR szDN;
|
|
HRESULT hr;
|
|
|
|
// skipping 7 chars for LDAP:// in the szResult
|
|
hr = UnEscapeLdapPath(szResult+7, &szDN);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
|
|
}
|
|
else {
|
|
SetDlgItemText(hDlg, IDC_EDIT1, szDN);
|
|
LocalFree(szDN);
|
|
}
|
|
}
|
|
|
|
LocalFree(szResult);
|
|
}
|
|
break;
|
|
|
|
case IDC_BUTTON2:
|
|
// browse for computer's OU
|
|
|
|
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))
|
|
{
|
|
LPWSTR szDN;
|
|
HRESULT hr;
|
|
|
|
// skipping 7 chars for LDAP:// in the szResult
|
|
hr = UnEscapeLdapPath(szResult+7, &szDN);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
|
|
}
|
|
else {
|
|
SetDlgItemText(hDlg, IDC_EDIT2, szDN);
|
|
LocalFree(szDN);
|
|
}
|
|
}
|
|
|
|
LocalFree(szResult);
|
|
}
|
|
break;
|
|
|
|
case IDC_BUTTON3:
|
|
if (IsWindowEnabled (GetDlgItem(hDlg, IDC_EDIT1)))
|
|
{
|
|
if ( pWizard->m_szDefaultUserSOM != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT1, pWizard->m_szDefaultUserSOM);
|
|
}
|
|
}
|
|
|
|
if (IsWindowEnabled (GetDlgItem(hDlg, IDC_EDIT2)))
|
|
{
|
|
if ( pWizard->m_szDefaultComputerSOM != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT2, pWizard->m_szDefaultComputerSOM);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
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 ( pQuery->pUser->szSOM != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT1, pQuery->pUser->szSOM );
|
|
if ( pQuery->pUser->szName == NULL )
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE);
|
|
}
|
|
}
|
|
else if ( pWizard->m_szDefaultUserSOM != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT1, pWizard->m_szDefaultUserSOM);
|
|
}
|
|
else if ( pQuery->pUser->szName == NULL )
|
|
{
|
|
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 ( pQuery->pComputer->szSOM != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT2, pQuery->pComputer->szSOM);
|
|
if ( pQuery->pComputer->szName == NULL )
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BUTTON2), FALSE);
|
|
}
|
|
}
|
|
else if ( pWizard->m_szDefaultComputerSOM != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT2, pWizard->m_szDefaultComputerSOM);
|
|
}
|
|
else if ( pQuery->pComputer->szName == NULL )
|
|
{
|
|
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_WIZBACK:
|
|
case PSN_WIZNEXT:
|
|
{
|
|
LPTSTR lpUserSOM = NULL, lpComputerSOM = NULL;
|
|
HRESULT hr;
|
|
|
|
|
|
GetControlText(hDlg, IDC_EDIT1, lpUserSOM, FALSE);
|
|
GetControlText(hDlg, IDC_EDIT2, lpComputerSOM, FALSE);
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
pWizard->EscapeString(&lpUserSOM);
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
hr = pWizard->TestSOM (lpUserSOM, hDlg);
|
|
}
|
|
else {
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
if (hr != E_INVALIDARG)
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOUSERCONTAINER);
|
|
}
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
delete [] lpUserSOM;
|
|
}
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
delete [] lpComputerSOM;
|
|
}
|
|
|
|
if ( ((NMHDR FAR*)lParam)->code == PSN_WIZNEXT )
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
pWizard->EscapeString(&lpComputerSOM);
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
hr = pWizard->TestSOM (lpComputerSOM, hDlg);
|
|
}
|
|
else {
|
|
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
if (hr != E_INVALIDARG)
|
|
{
|
|
ReportError (hDlg, hr, IDS_NOCOMPUTERCONTAINER);
|
|
}
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
delete [] lpUserSOM;
|
|
}
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
delete [] lpComputerSOM;
|
|
}
|
|
|
|
if ( ((NMHDR FAR*)lParam)->code == PSN_WIZNEXT )
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lpUserSOM)
|
|
{
|
|
hr = UnEscapeLdapPath(lpUserSOM, &pQuery->pUser->szSOM);
|
|
delete [] lpUserSOM;
|
|
lpUserSOM = NULL;
|
|
}
|
|
else {
|
|
pQuery->pUser->szSOM = NULL;
|
|
}
|
|
|
|
if (lpComputerSOM)
|
|
{
|
|
hr = UnEscapeLdapPath(lpComputerSOM, &pQuery->pComputer->szSOM);
|
|
delete [] lpComputerSOM;
|
|
lpComputerSOM = NULL;
|
|
}
|
|
else {
|
|
pQuery->pComputer->szSOM = NULL;
|
|
}
|
|
|
|
if ( (pWizard->m_szDefaultUserSOM != NULL) && (pQuery->pUser->szSOM != NULL) )
|
|
{
|
|
if (!lstrcmpi(pWizard->m_szDefaultUserSOM, pQuery->pUser->szSOM))
|
|
{
|
|
LocalFree( pQuery->pUser->szSOM );
|
|
pQuery->pUser->szSOM = NULL;
|
|
}
|
|
}
|
|
|
|
if ( (pWizard->m_szDefaultComputerSOM != NULL) && (pQuery->pComputer->szSOM != NULL) )
|
|
{
|
|
if (!lstrcmpi(pWizard->m_szDefaultComputerSOM, pQuery->pComputer->szSOM))
|
|
{
|
|
LocalFree( pQuery->pComputer->szSOM );
|
|
pQuery->pComputer->szSOM = NULL;
|
|
}
|
|
}
|
|
|
|
if ( ((NMHDR FAR*)lParam)->code == PSN_WIZNEXT )
|
|
{
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_ALTDIRS;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
if ( (NULL == pQuery->pUser->szName) && (NULL == pQuery->pUser->szSOM) )
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_ALTDIRS;
|
|
|
|
if ( (pQuery->pComputer->szName != NULL) || (pQuery->pComputer->szSOM != NULL) )
|
|
{
|
|
if ( RSOP_LOOPBACK_NONE == pQuery->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, pWizard->m_lPlanningFinishedPage);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZFINISH:
|
|
// fall through
|
|
|
|
case PSN_RESET:
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
return TRUE;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPAltUserSecDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_BUTTON1:
|
|
{
|
|
TCHAR * sz;
|
|
|
|
if ( 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) == S_OK )
|
|
{
|
|
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 ( pQuery->pUser->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwSecurityGroupCount, pQuery->pUser->aszSecurityGroups );
|
|
pQuery->pUser->dwSecurityGroupCount = 0;
|
|
pQuery->pUser->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pUser->adwSecurityGroupsAttr );
|
|
pQuery->pUser->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
|
|
if ( pWizard->m_dwDefaultUserSecurityGroupCount != 0 )
|
|
{
|
|
pWizard->FillListFromSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_dwDefaultUserSecurityGroupCount,
|
|
pWizard->m_aszDefaultUserSecurityGroups,
|
|
pWizard->m_adwDefaultUserSecurityGroupsAttr );
|
|
}
|
|
else
|
|
{
|
|
pWizard->BuildMembershipList( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_pUserObject,
|
|
&(pWizard->m_dwDefaultUserSecurityGroupCount),
|
|
&(pWizard->m_aszDefaultUserSecurityGroups),
|
|
&(pWizard->m_adwDefaultUserSecurityGroupsAttr) );
|
|
}
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
|
|
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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
if ( pQuery->pUser->dwSecurityGroupCount != 0 )
|
|
{
|
|
pWizard->FillListFromSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
pQuery->pUser->dwSecurityGroupCount,
|
|
pQuery->pUser->aszSecurityGroups,
|
|
pQuery->pUser->adwSecurityGroupsAttr );
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
|
|
}
|
|
else if ( pWizard->m_dwDefaultUserSecurityGroupCount != 0 )
|
|
{
|
|
pWizard->FillListFromSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_dwDefaultUserSecurityGroupCount,
|
|
pWizard->m_aszDefaultUserSecurityGroups,
|
|
pWizard->m_adwDefaultUserSecurityGroupsAttr );
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
|
|
}
|
|
else
|
|
{
|
|
pWizard->BuildMembershipList( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_pUserObject,
|
|
&(pWizard->m_dwDefaultUserSecurityGroupCount),
|
|
&(pWizard->m_aszDefaultUserSecurityGroups),
|
|
&(pWizard->m_adwDefaultUserSecurityGroupsAttr) );
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
|
|
}
|
|
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
// Free the previous list of security groups
|
|
if ( pQuery->pUser->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwSecurityGroupCount, pQuery->pUser->aszSecurityGroups );
|
|
pQuery->pUser->dwSecurityGroupCount = 0;
|
|
pQuery->pUser->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pUser->adwSecurityGroupsAttr );
|
|
pQuery->pUser->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
pWizard->SaveSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
&(pQuery->pUser->dwSecurityGroupCount),
|
|
&(pQuery->pUser->aszSecurityGroups),
|
|
&(pQuery->pUser->adwSecurityGroupsAttr) );
|
|
|
|
// 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 ( pWizard->CompareStringLists( pWizard->m_dwDefaultUserSecurityGroupCount,
|
|
pWizard->m_aszDefaultUserSecurityGroups,
|
|
pQuery->pUser->dwSecurityGroupCount,
|
|
pQuery->pUser->aszSecurityGroups ) )
|
|
{
|
|
if ( pQuery->pUser->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwSecurityGroupCount, pQuery->pUser->aszSecurityGroups );
|
|
pQuery->pUser->dwSecurityGroupCount = 0;
|
|
pQuery->pUser->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pUser->adwSecurityGroupsAttr );
|
|
pQuery->pUser->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
}
|
|
|
|
// Now check where we should go
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_ALTUSERSEC;
|
|
// skip to the diagnostic pages
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
if ( (NULL == pQuery->pComputer->szName) && (NULL == pQuery->pComputer->szSOM) )
|
|
{
|
|
// skip to the finish page
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_ALTUSERSEC;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLUSER);
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
{
|
|
// Free the previous list of security groups
|
|
if ( pQuery->pUser->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwSecurityGroupCount, pQuery->pUser->aszSecurityGroups );
|
|
pQuery->pUser->dwSecurityGroupCount = 0;
|
|
pQuery->pUser->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pUser->adwSecurityGroupsAttr );
|
|
pQuery->pUser->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
pWizard->SaveSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
&(pQuery->pUser->dwSecurityGroupCount),
|
|
&(pQuery->pUser->aszSecurityGroups),
|
|
&(pQuery->pUser->adwSecurityGroupsAttr) );
|
|
|
|
// 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 ( pWizard->CompareStringLists( pWizard->m_dwDefaultUserSecurityGroupCount,
|
|
pWizard->m_aszDefaultUserSecurityGroups,
|
|
pQuery->pUser->dwSecurityGroupCount,
|
|
pQuery->pUser->aszSecurityGroups ) )
|
|
{
|
|
if ( pQuery->pUser->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwSecurityGroupCount, pQuery->pUser->aszSecurityGroups );
|
|
pQuery->pUser->dwSecurityGroupCount = 0;
|
|
pQuery->pUser->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pUser->adwSecurityGroupsAttr );
|
|
pQuery->pUser->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
}
|
|
|
|
// Now check where we should go
|
|
if ( (pQuery->pUser->szName == NULL) && (pQuery->pComputer->szName == NULL) )
|
|
{
|
|
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 CRSOPWizardDlg::RSOPAltCompSecDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_BUTTON1:
|
|
{
|
|
TCHAR * sz;
|
|
|
|
if ( 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) == S_OK )
|
|
{
|
|
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 ( pQuery->pComputer->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwSecurityGroupCount, pQuery->pComputer->aszSecurityGroups );
|
|
pQuery->pComputer->dwSecurityGroupCount = 0;
|
|
pQuery->pComputer->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pComputer->adwSecurityGroupsAttr );
|
|
pQuery->pComputer->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
|
|
if ( pWizard->m_dwDefaultComputerSecurityGroupCount != 0 )
|
|
{
|
|
pWizard->FillListFromSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_dwDefaultComputerSecurityGroupCount,
|
|
pWizard->m_aszDefaultComputerSecurityGroups,
|
|
pWizard->m_adwDefaultComputerSecurityGroupsAttr );
|
|
}
|
|
else
|
|
{
|
|
pWizard->BuildMembershipList( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_pComputerObject,
|
|
&(pWizard->m_dwDefaultComputerSecurityGroupCount),
|
|
&(pWizard->m_aszDefaultComputerSecurityGroups),
|
|
&(pWizard->m_adwDefaultComputerSecurityGroupsAttr) );
|
|
}
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
|
|
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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
if ( pQuery->pComputer->dwSecurityGroupCount != 0 )
|
|
{
|
|
pWizard->FillListFromSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
pQuery->pComputer->dwSecurityGroupCount,
|
|
pQuery->pComputer->aszSecurityGroups,
|
|
pQuery->pComputer->adwSecurityGroupsAttr );
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), TRUE);
|
|
}
|
|
else if ( pWizard->m_dwDefaultComputerSecurityGroupCount != 0 )
|
|
{
|
|
pWizard->FillListFromSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_dwDefaultComputerSecurityGroupCount,
|
|
pWizard->m_aszDefaultComputerSecurityGroups,
|
|
pWizard->m_adwDefaultComputerSecurityGroupsAttr );
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
|
|
}
|
|
else
|
|
{
|
|
pWizard->BuildMembershipList( GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_pComputerObject,
|
|
&(pWizard->m_dwDefaultComputerSecurityGroupCount),
|
|
&(pWizard->m_aszDefaultComputerSecurityGroups),
|
|
&(pWizard->m_adwDefaultComputerSecurityGroupsAttr) );
|
|
|
|
EnableWindow (GetDlgItem(hDlg, IDC_BUTTON3), FALSE);
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
// Free the previous list of security groups
|
|
if ( pQuery->pComputer->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwSecurityGroupCount, pQuery->pComputer->aszSecurityGroups );
|
|
pQuery->pComputer->dwSecurityGroupCount = 0;
|
|
pQuery->pComputer->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pComputer->adwSecurityGroupsAttr );
|
|
pQuery->pComputer->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
pWizard->SaveSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
&(pQuery->pComputer->dwSecurityGroupCount),
|
|
&(pQuery->pComputer->aszSecurityGroups),
|
|
&(pQuery->pComputer->adwSecurityGroupsAttr) );
|
|
|
|
|
|
// 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 ( pWizard->CompareStringLists( pWizard->m_dwDefaultComputerSecurityGroupCount,
|
|
pWizard->m_aszDefaultComputerSecurityGroups,
|
|
pQuery->pComputer->dwSecurityGroupCount,
|
|
pQuery->pComputer->aszSecurityGroups ) )
|
|
{
|
|
if ( pQuery->pComputer->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwSecurityGroupCount, pQuery->pComputer->aszSecurityGroups );
|
|
pQuery->pComputer->dwSecurityGroupCount = 0;
|
|
pQuery->pComputer->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pComputer->adwSecurityGroupsAttr );
|
|
pQuery->pComputer->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
}
|
|
|
|
// Now check where to go
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_ALTCOMPSEC;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
if ( (NULL == pQuery->pUser->szName) && (NULL == pQuery->pUser->szSOM) && (RSOP_LOOPBACK_NONE == pQuery->LoopbackMode) )
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_ALTCOMPSEC;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLCOMP);
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
{
|
|
// Free the previous list of security groups
|
|
if ( pQuery->pComputer->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwSecurityGroupCount, pQuery->pComputer->aszSecurityGroups );
|
|
pQuery->pComputer->dwSecurityGroupCount = 0;
|
|
pQuery->pComputer->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pComputer->adwSecurityGroupsAttr );
|
|
pQuery->pComputer->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
pWizard->SaveSecurityGroups( GetDlgItem(hDlg, IDC_LIST1),
|
|
&(pQuery->pComputer->dwSecurityGroupCount),
|
|
&(pQuery->pComputer->aszSecurityGroups),
|
|
&(pQuery->pComputer->adwSecurityGroupsAttr) );
|
|
|
|
|
|
// 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 ( pWizard->CompareStringLists( pWizard->m_dwDefaultComputerSecurityGroupCount,
|
|
pWizard->m_aszDefaultComputerSecurityGroups,
|
|
pQuery->pComputer->dwSecurityGroupCount,
|
|
pQuery->pComputer->aszSecurityGroups ) )
|
|
{
|
|
if ( pQuery->pComputer->dwSecurityGroupCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwSecurityGroupCount, pQuery->pComputer->aszSecurityGroups );
|
|
pQuery->pComputer->dwSecurityGroupCount = 0;
|
|
pQuery->pComputer->aszSecurityGroups = NULL;
|
|
LocalFree( pQuery->pComputer->adwSecurityGroupsAttr );
|
|
pQuery->pComputer->adwSecurityGroupsAttr = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
if ( (pQuery->pUser->szName == NULL) && (pQuery->pUser->szSOM == NULL) )
|
|
{
|
|
if ( pQuery->pComputer->szName != NULL )
|
|
{
|
|
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;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPWQLUserDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
SetFocus(GetDlgItem(hDlg, IDC_RADIO2));
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
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 ( pQuery->pUser->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilters );
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilterNames );
|
|
pQuery->pUser->dwWQLFilterCount = 0;
|
|
pQuery->pUser->aszWQLFilters = NULL;
|
|
pQuery->pUser->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
pQuery->pUser->bAssumeWQLFiltersTrue = FALSE;
|
|
|
|
if ( pWizard->m_dwDefaultUserWQLFilterCount != 0 )
|
|
{
|
|
pWizard->FillListFromWQLFilters(GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_dwDefaultUserWQLFilterCount,
|
|
pWizard->m_aszDefaultUserWQLFilterNames,
|
|
pWizard->m_aszDefaultUserWQLFilters );
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
else {
|
|
PostMessage (hDlg, WM_BUILDWQLLIST, 0, 0);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_RADIO2:
|
|
{
|
|
if ( IsDlgButtonChecked( hDlg, IDC_RADIO2 ) )
|
|
{
|
|
if ( pQuery->pUser->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilters );
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilterNames );
|
|
pQuery->pUser->dwWQLFilterCount = 0;
|
|
pQuery->pUser->aszWQLFilters = NULL;
|
|
pQuery->pUser->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
pQuery->pUser->bAssumeWQLFiltersTrue = TRUE;
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
|
|
case IDC_RADIO3:
|
|
{
|
|
if ( IsDlgButtonChecked( hDlg, IDC_RADIO3 ) )
|
|
{
|
|
pQuery->pUser->bAssumeWQLFiltersTrue = FALSE;
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_BUILDWQLLIST:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
pWizard->BuildWQLFilterList (hDlg, TRUE, &(pWizard->m_dwDefaultUserWQLFilterCount),
|
|
&(pWizard->m_aszDefaultUserWQLFilterNames),
|
|
&(pWizard->m_aszDefaultUserWQLFilters) );
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
|
|
case WM_REFRESHDISPLAY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
if ( pQuery->pUser->bAssumeWQLFiltersTrue )
|
|
{
|
|
// set the listbox to null
|
|
pWizard->FillListFromWQLFilters(GetDlgItem(hDlg, IDC_LIST1), 0, 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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
if ( !pQuery->pUser->bAssumeWQLFiltersTrue )
|
|
{
|
|
pWizard->FillListFromWQLFilters(GetDlgItem(hDlg, IDC_LIST1),
|
|
pQuery->pUser->dwWQLFilterCount,
|
|
pQuery->pUser->aszWQLFilterNames,
|
|
pQuery->pUser->aszWQLFilters );
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
// Free the previous list of WQL Filters
|
|
if ( pQuery->pUser->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilters );
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilterNames );
|
|
pQuery->pUser->dwWQLFilterCount = 0;
|
|
pQuery->pUser->aszWQLFilters = NULL;
|
|
pQuery->pUser->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
if ( !pQuery->pUser->bAssumeWQLFiltersTrue )
|
|
{
|
|
pWizard->SaveWQLFilters(GetDlgItem(hDlg, IDC_LIST1), &(pQuery->pUser->dwWQLFilterCount),
|
|
&(pQuery->pUser->aszWQLFilterNames),
|
|
&(pQuery->pUser->aszWQLFilters) );
|
|
}
|
|
|
|
|
|
// Move to the next page
|
|
if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0))
|
|
{
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_WQLUSER;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
if ( (NULL == pQuery->pComputer->szName) && (NULL == pQuery->pComputer->szSOM) )
|
|
{
|
|
// skip to the finish page
|
|
pWizard->m_dwSkippedFrom = IDD_RSOP_WQLUSER;
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
}
|
|
break;
|
|
|
|
case PSN_WIZBACK:
|
|
{
|
|
// Free the previous list of WQL Filters
|
|
if ( pQuery->pUser->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilters );
|
|
FreeStringList( pQuery->pUser->dwWQLFilterCount, pQuery->pUser->aszWQLFilterNames );
|
|
pQuery->pUser->dwWQLFilterCount = 0;
|
|
pQuery->pUser->aszWQLFilters = NULL;
|
|
pQuery->pUser->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
if ( !pQuery->pUser->bAssumeWQLFiltersTrue )
|
|
{
|
|
pWizard->SaveWQLFilters(GetDlgItem(hDlg, IDC_LIST1), &(pQuery->pUser->dwWQLFilterCount),
|
|
&(pQuery->pUser->aszWQLFilterNames),
|
|
&(pQuery->pUser->aszWQLFilters) );
|
|
}
|
|
|
|
// Check which page to go back to
|
|
if ( (pQuery->pComputer->szName == NULL) && (pQuery->pComputer->szSOM == NULL) )
|
|
{
|
|
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 CRSOPWizardDlg::RSOPWQLCompDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
SetFocus(GetDlgItem(hDlg, IDC_RADIO2));
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
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 ( pQuery->pComputer->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilters );
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilterNames );
|
|
pQuery->pComputer->dwWQLFilterCount = 0;
|
|
pQuery->pComputer->aszWQLFilters = NULL;
|
|
pQuery->pComputer->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
pQuery->pComputer->bAssumeWQLFiltersTrue = FALSE;
|
|
|
|
if ( pWizard->m_dwDefaultComputerWQLFilterCount != 0 )
|
|
{
|
|
pWizard->FillListFromWQLFilters(GetDlgItem(hDlg, IDC_LIST1),
|
|
pWizard->m_dwDefaultComputerWQLFilterCount,
|
|
pWizard->m_aszDefaultComputerWQLFilterNames,
|
|
pWizard->m_aszDefaultComputerWQLFilters );
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
PostMessage (hDlg, WM_BUILDWQLLIST, 0, 0);
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case IDC_RADIO2:
|
|
{
|
|
if ( IsDlgButtonChecked( hDlg, IDC_RADIO2 ) )
|
|
{
|
|
if ( pQuery->pComputer->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilters );
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilterNames );
|
|
pQuery->pComputer->dwWQLFilterCount = 0;
|
|
pQuery->pComputer->aszWQLFilters = NULL;
|
|
pQuery->pComputer->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
pQuery->pComputer->bAssumeWQLFiltersTrue = TRUE;
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
|
|
case IDC_RADIO3:
|
|
{
|
|
if ( IsDlgButtonChecked( hDlg, IDC_RADIO3 ) )
|
|
{
|
|
pQuery->pComputer->bAssumeWQLFiltersTrue = FALSE;
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_BUILDWQLLIST:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
pWizard->BuildWQLFilterList (hDlg, FALSE, &(pWizard->m_dwDefaultComputerWQLFilterCount),
|
|
&(pWizard->m_aszDefaultComputerWQLFilterNames),
|
|
&(pWizard->m_aszDefaultComputerWQLFilters) );
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
break;
|
|
|
|
case WM_REFRESHDISPLAY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
if ( pQuery->pComputer->bAssumeWQLFiltersTrue )
|
|
{
|
|
// set the listbox to null
|
|
CheckDlgButton (hDlg, IDC_RADIO2, BST_CHECKED);
|
|
CheckDlgButton (hDlg, IDC_RADIO3, BST_UNCHECKED);
|
|
pWizard->FillListFromWQLFilters(GetDlgItem(hDlg, IDC_LIST1), 0, 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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK | PSWIZB_NEXT);
|
|
if ( !pQuery->pComputer->bAssumeWQLFiltersTrue )
|
|
{
|
|
pWizard->FillListFromWQLFilters(GetDlgItem(hDlg, IDC_LIST1),
|
|
pQuery->pComputer->dwWQLFilterCount,
|
|
pQuery->pComputer->aszWQLFilterNames,
|
|
pQuery->pComputer->aszWQLFilters );
|
|
}
|
|
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
// Free the previous list of WQL Filters
|
|
if ( pQuery->pComputer->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilters );
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilterNames );
|
|
pQuery->pComputer->dwWQLFilterCount = 0;
|
|
pQuery->pComputer->aszWQLFilters = NULL;
|
|
pQuery->pComputer->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
if ( !pQuery->pComputer->bAssumeWQLFiltersTrue )
|
|
{
|
|
pWizard->SaveWQLFilters (GetDlgItem(hDlg, IDC_LIST1), &(pQuery->pComputer->dwWQLFilterCount),
|
|
&(pQuery->pComputer->aszWQLFilterNames),
|
|
&(pQuery->pComputer->aszWQLFilters) );
|
|
}
|
|
|
|
pWizard->m_dwSkippedFrom = 0;
|
|
|
|
// Skip to the last page in the wizard
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_lPlanningFinishedPage);
|
|
return TRUE;
|
|
}
|
|
|
|
case PSN_WIZBACK:
|
|
{
|
|
// Free the previous list of WQL Filters
|
|
if ( pQuery->pComputer->dwWQLFilterCount != 0 )
|
|
{
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilters );
|
|
FreeStringList( pQuery->pComputer->dwWQLFilterCount, pQuery->pComputer->aszWQLFilterNames );
|
|
pQuery->pComputer->dwWQLFilterCount = 0;
|
|
pQuery->pComputer->aszWQLFilters = NULL;
|
|
pQuery->pComputer->aszWQLFilterNames = NULL;
|
|
}
|
|
|
|
// Save the current list
|
|
if ( !pQuery->pComputer->bAssumeWQLFiltersTrue )
|
|
{
|
|
pWizard->SaveWQLFilters (GetDlgItem(hDlg, IDC_LIST1), &(pQuery->pComputer->dwWQLFilterCount),
|
|
&(pQuery->pComputer->aszWQLFilterNames),
|
|
&(pQuery->pComputer->aszWQLFilters) );
|
|
}
|
|
|
|
// Check which page to go back to
|
|
if ( (pQuery->pUser->szName == NULL) && (pQuery->pUser->szSOM == NULL) )
|
|
{
|
|
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 CRSOPWizardDlg::RSOPFinishedDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// RSOP_LOGGING_MODE (IDD_RSOP_FINISHED)
|
|
// RSOP_PLANNING_MODE (IDD_RSOP_FINISHED3)
|
|
{
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
if (pWizard)
|
|
{
|
|
CRSOPWizard::InitializeResultsList (GetDlgItem (hDlg, IDC_LIST1));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_REFRESHDISPLAY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
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:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg*) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
|
|
case IDC_BUTTON1:
|
|
if (DialogBoxParam (g_hInstance, MAKEINTRESOURCE(IDD_RSOP_BROWSEDC), hDlg,
|
|
BrowseDCDlgProc, (LPARAM) pWizard))
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT1, pQuery->szDomainController);
|
|
}
|
|
break;
|
|
|
|
case IDC_EDIT1:
|
|
if (HIWORD(wParam) == EN_CHANGE)
|
|
{
|
|
PostMessage (hDlg, WM_REFRESHDISPLAY, 0, 0);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
switch (((NMHDR FAR*)lParam)->code)
|
|
{
|
|
case PSN_WIZBACK:
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
if ( pWizard->m_dwSkippedFrom != 0 )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, pWizard->m_dwSkippedFrom);
|
|
return TRUE;
|
|
}
|
|
else if ( (pQuery->pComputer->szName == NULL) && (pQuery->pComputer->szSOM == NULL) )
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLUSER);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_WQLCOMP);
|
|
return TRUE;
|
|
}
|
|
}
|
|
else // RSOP_LOGGING_MODE
|
|
{
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_GETUSER);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case PSN_SETACTIVE:
|
|
|
|
PropSheet_SetWizButtons (GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
if ( pQuery->szDomainController != NULL )
|
|
{
|
|
if ( !pWizard->IsComputerRSoPEnabled(pQuery->szDomainController))
|
|
{
|
|
LocalFree( pQuery->szDomainController );
|
|
pQuery->szDomainController = NULL;
|
|
}
|
|
}
|
|
|
|
if ( pQuery->szDomainController != NULL )
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT1, pQuery->szDomainController);
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemText (hDlg, IDC_EDIT1, TEXT(""));
|
|
}
|
|
}
|
|
|
|
CRSOPWizard::FillResultsList (GetDlgItem (hDlg, IDC_LIST1), pQuery, NULL );
|
|
|
|
if ( pWizard->m_pExtendedProcessing != NULL )
|
|
{
|
|
CheckDlgButton(hDlg, IDC_RADIO1, pWizard->m_pExtendedProcessing->GetExtendedErrorInfo() ? BST_CHECKED : BST_UNCHECKED );
|
|
}
|
|
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
pWizard->m_bFinalNextClicked = TRUE;
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
SetWaitCursor();
|
|
GetControlText(hDlg, IDC_EDIT1, pQuery->szDomainController, TRUE );
|
|
|
|
if ( ! pQuery->szDomainController || !pWizard->IsComputerRSoPEnabled( pQuery->szDomainController ) )
|
|
{
|
|
ClearWaitCursor();
|
|
ReportError(hDlg, GetLastError(), IDS_DCMISSINGRSOP);
|
|
pWizard->m_bFinalNextClicked = FALSE;
|
|
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 ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
EnableWindow( GetDlgItem(hDlg, IDC_BUTTON1), FALSE );
|
|
SendMessage( GetDlgItem(hDlg, IDC_EDIT1), EM_SETREADONLY, TRUE, 0 );
|
|
}
|
|
|
|
BOOL bGetExtendedInfo = FALSE;
|
|
if ( pWizard->m_pExtendedProcessing != NULL )
|
|
{
|
|
bGetExtendedInfo = (BOOL)SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0);
|
|
EnableWindow( GetDlgItem(hDlg, IDC_RADIO1), FALSE );
|
|
}
|
|
if ( bGetExtendedInfo )
|
|
{
|
|
pWizard->m_pRSOPQuery->dwFlags |= RSOP_90P_ONLY;
|
|
}
|
|
else
|
|
{
|
|
pWizard->m_pRSOPQuery->dwFlags = pWizard->m_pRSOPQuery->dwFlags & (RSOP_90P_ONLY ^ 0xffffffff);
|
|
}
|
|
|
|
// RM: InitializeRSOP used to be called here, but now we go directly to GenerateRSOPEx
|
|
{
|
|
pWizard->m_hrQuery = CRSOPWizard::GenerateRSOPDataEx(hDlg, pWizard->m_pRSOPQuery, &(pWizard->m_pRSOPQueryResults) );
|
|
if ( pWizard->m_hrQuery != S_OK )
|
|
{
|
|
PropSheet_SetWizButtons (GetParent(hDlg),PSWIZB_BACK);
|
|
pWizard->m_bFinalNextClicked = FALSE;
|
|
EnableWindow (GetDlgItem(GetParent(hDlg), IDCANCEL), TRUE);
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
EnableWindow( GetDlgItem(hDlg, IDC_BUTTON1), TRUE );
|
|
SendMessage( GetDlgItem(hDlg, IDC_EDIT1), EM_SETREADONLY, FALSE, 0 );
|
|
}
|
|
if ( pWizard->m_pExtendedProcessing != NULL )
|
|
{
|
|
EnableWindow( GetDlgItem(hDlg, IDC_RADIO1), TRUE );
|
|
}
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if ( pWizard->m_pExtendedProcessing != NULL )
|
|
{
|
|
pWizard->m_pExtendedProcessing->DoProcessing( pWizard->m_pRSOPQuery,
|
|
pWizard->m_pRSOPQueryResults,
|
|
bGetExtendedInfo );
|
|
SendMessage( GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETRANGE32, 0, (LPARAM) 100);
|
|
SendMessage( GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM) 100, 0);
|
|
EnableWindow( GetDlgItem(hDlg, IDC_RADIO1), TRUE );
|
|
}
|
|
|
|
// skip to the VERY last page in the wizard
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
EnableWindow( GetDlgItem(hDlg, IDC_BUTTON1), TRUE );
|
|
SendMessage( GetDlgItem(hDlg, IDC_EDIT1), EM_SETREADONLY, FALSE, 0 );
|
|
}
|
|
|
|
SetWindowLong(hDlg, DWLP_MSGRESULT, IDD_RSOP_FINISHED2);
|
|
pWizard->m_bFinalNextClicked = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
case PSN_RESET:
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
return TRUE;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
{
|
|
if (pWizard->m_bFinalNextClicked)
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::RSOPFinished2DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// Both modes
|
|
{
|
|
static BOOL iCancelQuery = FALSE;
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_RSOP_BIG_BOLD1),
|
|
WM_SETFONT, (WPARAM)pWizard->m_BigBoldFont, (LPARAM)TRUE);
|
|
|
|
/*
|
|
if (!pWizard->m_hChooseBitmap)
|
|
{
|
|
pWizard->m_hChooseBitmap = (HBITMAP) LoadImage (g_hInstance,
|
|
MAKEINTRESOURCE(IDB_WIZARD),
|
|
IMAGE_BITMAP, 0, 0,
|
|
LR_DEFAULTCOLOR);
|
|
}
|
|
|
|
if (pWizard->m_hChooseBitmap)
|
|
{
|
|
SendDlgItemMessage (hDlg, IDC_BITMAP, STM_SETIMAGE,
|
|
IMAGE_BITMAP, (LPARAM) pWizard->m_hChooseBitmap);
|
|
}
|
|
*/
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
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;
|
|
|
|
// Ignore the 'X' button on the upper right corner
|
|
case PSN_QUERYCANCEL:
|
|
{
|
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, TRUE);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::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);
|
|
hr = StringCchCopy (BigBoldLogFont.lfFaceName, LF_FACESIZE, L"Verdana");
|
|
if (FAILED(hr))
|
|
{
|
|
goto end;
|
|
}
|
|
}
|
|
|
|
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);
|
|
hr = StringCchCopy (BoldLogFont.lfFaceName, LF_FACESIZE, L"Verdana");
|
|
if (FAILED(hr))
|
|
{
|
|
goto end;
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::FillUserList (HWND hList, BOOL* pbFoundCurrentUser, BOOL* pbFoundFixedUser)
|
|
{
|
|
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 bFixUser = FALSE;
|
|
*pbFoundFixedUser = FALSE;
|
|
|
|
// This method only gets called from RSOPGetUserDlgProc, which means that it must be logging mode!
|
|
if ( m_pRSOPQuery->QueryType != RSOP_LOGGING_MODE )
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: Not called in planning mode.") ));
|
|
return E_FAIL;
|
|
}
|
|
if ( m_pRSOPQuery->szComputerName == NULL )
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: Called without computer name set.") ));
|
|
return E_FAIL;
|
|
}
|
|
|
|
bFixUser = (m_pRSOPQuery->dwFlags & RSOP_FIX_USER) == RSOP_FIX_USER;
|
|
|
|
// Get the "selected" user's Sid
|
|
if ( (m_pRSOPQuery->szUserName != NULL) && bFixUser )
|
|
{
|
|
szUserSidPref = MyLookupAccountName(
|
|
(lstrcmpi( m_pRSOPQuery->szComputerName, TEXT(".")) == 0) ? NULL : NameWithoutDomain(m_pRSOPQuery->szComputerName),
|
|
m_pRSOPQuery->szUserName );
|
|
|
|
if ( szUserSidPref == NULL )
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: MyLookupAccountName failed with %d"), hr));
|
|
}
|
|
}
|
|
|
|
if ( lstrcmpi(m_pRSOPQuery->szComputerName, TEXT(".")) )
|
|
{
|
|
lpSystemName = m_pRSOPQuery->szComputerName;
|
|
}
|
|
|
|
|
|
*pbFoundCurrentUser = 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"
|
|
hr = StringCchPrintf (szBuffer, ARRAYSIZE(szBuffer), TEXT("\\\\%s\\root\\rsop"), NameWithoutDomain(m_pRSOPQuery->szComputerName));
|
|
if (FAILED(hr))
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::FillUserList: Could not copy Name without domain with 0x%x"), hr));
|
|
goto Cleanup;
|
|
}
|
|
|
|
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 and to enable encryption
|
|
hr = CoSetProxyBlanket(pNamespace,
|
|
RPC_C_AUTHN_DEFAULT,
|
|
RPC_C_AUTHZ_DEFAULT,
|
|
COLE_DEFAULT_PRINCIPAL,
|
|
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
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)))
|
|
{
|
|
ULONG ulNoChars = lstrlen(bstrSid) + 1;
|
|
lpData = new WCHAR[ulNoChars];
|
|
|
|
if (lpData)
|
|
{
|
|
hr = StringCchCopy (lpData, ulNoChars, bstrSid);
|
|
ASSERT(SUCCEEDED(hr));
|
|
|
|
|
|
if (lpCurrentUserSid)
|
|
{
|
|
if (!lstrcmpi(lpCurrentUserSid, lpData))
|
|
{
|
|
*pbFoundCurrentUser = 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 = (!bFixUser || (lstrcmpi(szUserSidPref, lpData) == 0));
|
|
|
|
if ( bFixUser && (lstrcmpi(szUserSidPref, lpData) == 0))
|
|
{
|
|
*pbFoundFixedUser = TRUE;
|
|
m_pRSOPQuery->szUserSid = szUserSidPref;
|
|
}
|
|
|
|
if (bAddUser)
|
|
{
|
|
hr = StringCchPrintf (szFullName, ARRAYSIZE(szFullName), TEXT("%s\\%s"), szDomain, szName);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
ZeroMemory (&item, sizeof(item));
|
|
item.mask = LVIF_TEXT | LVIF_PARAM;
|
|
item.pszText = szFullName;
|
|
item.lParam = (LPARAM) lpData;
|
|
|
|
iRet = ListView_InsertItem(hList, &item);
|
|
|
|
if (iRet == -1)
|
|
{
|
|
delete [] lpData;
|
|
}
|
|
else if ( (szUserSidPref != NULL) && !lstrcmpi(szUserSidPref, lpData) )
|
|
{
|
|
ListView_SetItemState( hList, iRet, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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 ( bFixUser && !(*pbFoundFixedUser) )
|
|
{
|
|
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);
|
|
}
|
|
|
|
if ( !(*pbFoundFixedUser))
|
|
{
|
|
LocalFree(szUserSidPref);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::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
|
|
//
|
|
|
|
BSTR bstrLDAP = SysAllocString(TEXT("LDAP"));
|
|
if ( bstrLDAP == NULL )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Exit;
|
|
}
|
|
hr = pADsPathnameSrc->Set (bstrLDAP, ADS_SETTYPE_PROVIDER);
|
|
SysFreeString( bstrLDAP );
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
BSTR bstrTmpString = SysAllocString( *lpString );
|
|
if ( bstrTmpString == NULL )
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Exit;
|
|
}
|
|
hr = pADsPathnameSrc->Set (bstrTmpString, ADS_SETTYPE_DN);
|
|
SysFreeString( bstrTmpString );
|
|
|
|
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
|
|
//
|
|
|
|
ULONG ulNoChars = lstrlen(bstr) + 1;
|
|
lpTemp = new TCHAR [ulNoChars];
|
|
|
|
if (lpTemp)
|
|
{
|
|
hr = StringCchCopy (lpTemp, ulNoChars, bstr);
|
|
ASSERT(SUCCEEDED(hr));
|
|
|
|
delete [] *lpString;
|
|
*lpString = lpTemp;
|
|
}
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
if (bstr)
|
|
{
|
|
SysFreeString (bstr);
|
|
}
|
|
|
|
if (pADsPathnameDest)
|
|
{
|
|
pADsPathnameDest->Release();
|
|
}
|
|
|
|
if (pADsPathnameSrc)
|
|
{
|
|
pADsPathnameSrc->Release();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT CALLBACK CRSOPWizardDlg::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) g_aBrowseForOUHelpIds);
|
|
}
|
|
else if (uMsg == DSBM_CONTEXTMENU)
|
|
{
|
|
WinHelp((HWND) lParam, HELP_FILE, HELP_CONTEXTMENU,
|
|
(ULONG_PTR) (LPSTR) g_aBrowseForOUHelpIds);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK CRSOPWizardDlg::BrowseDCDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
// Only called in RSOPFinishedDlgProc where QueryType == RSOP_PLANNING_MODE
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) lParam;
|
|
SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pWizard);
|
|
pWizard->InitializeDCInfo(hDlg);
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CRSOPWizardDlg* pWizard = (CRSOPWizardDlg *) GetWindowLongPtr (hDlg, DWLP_USER);
|
|
|
|
if (!pWizard)
|
|
{
|
|
break;
|
|
}
|
|
|
|
LPRSOP_QUERY pQuery = pWizard->m_pRSOPQuery;
|
|
|
|
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;
|
|
}
|
|
|
|
if ( pQuery->QueryType == RSOP_PLANNING_MODE )
|
|
{
|
|
LocalFree( pQuery->szDomainController );
|
|
|
|
pQuery->szDomainController = (TCHAR*)LocalAlloc( LPTR, (iStrLen+1) * sizeof(TCHAR) );
|
|
|
|
if ( pQuery->szDomainController == NULL )
|
|
{
|
|
break;
|
|
}
|
|
|
|
SendDlgItemMessage (hDlg, IDC_LIST1, LB_GETTEXT, (WPARAM) iSel, (LPARAM) pQuery->szDomainController );
|
|
}
|
|
|
|
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) g_aBrowseDCHelpIds);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
|
|
(ULONG_PTR) (LPSTR) g_aBrowseDCHelpIds);
|
|
return (TRUE);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::InitializeSitesInfo (HWND hDlg)
|
|
// RSOP_PLANNING_MODE - only called from RSOPGetDCDlgProc
|
|
{
|
|
LPTSTR szDomain = NULL;
|
|
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 the focused domain.
|
|
if ( m_pRSOPQuery->pComputer->szName != NULL )
|
|
{
|
|
// Try and get the computer's domain
|
|
szDomain = ExtractDomain( m_pRSOPQuery->pComputer->szName );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (m_pRSOPQuery->pComputer->szSOM != NULL) )
|
|
{
|
|
// Try and get the computer's domain from the SOM
|
|
szDomain = GetDomainFromSOM( m_pRSOPQuery->pComputer->szSOM );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (m_pRSOPQuery->pUser->szName != NULL) )
|
|
{
|
|
// Try and get the user's domain
|
|
szDomain = ExtractDomain( m_pRSOPQuery->pUser->szName );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (m_pRSOPQuery->pUser->szSOM != NULL) )
|
|
{
|
|
// Try and get the user's domain from the SOM
|
|
szDomain = GetDomainFromSOM( m_pRSOPQuery->pUser->szSOM );
|
|
}
|
|
|
|
if ( szDomain == NULL )
|
|
{
|
|
// Use the local domain
|
|
LPTSTR szName;
|
|
szName = MyGetUserName(NameSamCompatible);
|
|
if ( szName != NULL )
|
|
{
|
|
szDomain = ExtractDomain(szName);
|
|
LocalFree( 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_pRSOPQuery->dwFlags & RSOP_FIX_SITENAME) == RSOP_FIX_SITENAME )
|
|
{
|
|
LPWSTR szSiteFriendlyName=NULL;
|
|
|
|
// Get the friendly name
|
|
if ( GetSiteFriendlyName(m_pRSOPQuery->szSite, &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_pRSOPQuery->dwFlags & RSOP_FIX_SITENAME) == 0 )
|
|
{
|
|
TCHAR szString[1024];
|
|
LoadString (g_hInstance, IDS_NONE, szString, ARRAYSIZE(szString));
|
|
|
|
iIndex = (int) SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING,
|
|
(WPARAM) 0, (LPARAM) (LPCTSTR) szString);
|
|
}
|
|
|
|
// Set the initial selection
|
|
if ( (m_pRSOPQuery->dwFlags & RSOP_FIX_SITENAME) == RSOP_FIX_SITENAME )
|
|
{
|
|
iDefault = (INT) SendMessage (GetDlgItem(hDlg, IDC_COMBO1), CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1, (LPARAM) m_pRSOPQuery->szSite );
|
|
}
|
|
else if ( m_pRSOPQuery->szSite != NULL )
|
|
{
|
|
iDefault = (INT) SendMessage (GetDlgItem(hDlg, IDC_COMBO1), CB_FINDSTRINGEXACT,
|
|
(WPARAM) -1, (LPARAM) m_pRSOPQuery->szSite);
|
|
}
|
|
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_SETCURSEL,
|
|
(WPARAM) (iDefault == CB_ERR) ? iIndex : iDefault, NULL);
|
|
|
|
|
|
if ( szDomain != NULL )
|
|
{
|
|
delete [] szDomain;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
BOOL CRSOPWizardDlg::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;
|
|
|
|
//
|
|
// 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)
|
|
{
|
|
hr = StringCchPrintf (lpWMIPath, dwSize, TEXT("\\\\%s\\root\\rsop"), lpName);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::IsComputerRSoPEnabled: Could not copy WMI path")));
|
|
SetLastError(HRESULT_CODE(hr));
|
|
}
|
|
|
|
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: 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;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
BOOL CRSOPWizardDlg::TestAndValidateComputer(HWND hDlg)
|
|
// RSOP_LOGGING_MODE - only called in RSOPGetCompDlgProc
|
|
{
|
|
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;
|
|
HRESULT hr;
|
|
ULONG ulNoChars;
|
|
|
|
if ( (m_pRSOPQuery->szComputerName != NULL) && lstrcmpi(m_pRSOPQuery->szComputerName, TEXT(".")) )
|
|
{
|
|
ulNoChars = lstrlen(m_pRSOPQuery->szComputerName) + 3;
|
|
lpMachineName = new TCHAR[ulNoChars];
|
|
|
|
if ( lpMachineName == NULL )
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: Failed to allocate memory with %d"), GetLastError()));
|
|
goto Exit;
|
|
}
|
|
|
|
hr = StringCchCopy (lpMachineName, ulNoChars, TEXT("\\\\"));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((lstrlen (m_pRSOPQuery->szComputerName) > 2) && (m_pRSOPQuery->szComputerName[0] == TEXT('\\')) &&
|
|
(m_pRSOPQuery->szComputerName[1] == TEXT('\\')))
|
|
{
|
|
hr = StringCchCat (lpMachineName, ulNoChars, m_pRSOPQuery->szComputerName + 2);
|
|
}
|
|
else
|
|
{
|
|
hr = StringCchCat (lpMachineName, ulNoChars, NameWithoutDomain(m_pRSOPQuery->szComputerName) );
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestAndValidateComputer: Could not copy machine name with 0x%x"), hr));
|
|
goto Exit;
|
|
}
|
|
|
|
}
|
|
|
|
SetWaitCursor();
|
|
|
|
//
|
|
// If we are testing a remote machine, test if the machine is alive and has
|
|
// the rsop namespace
|
|
//
|
|
|
|
if ( lpMachineName != NULL )
|
|
{
|
|
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_pRSOPQuery->szComputerName);
|
|
}
|
|
else
|
|
{
|
|
ReportError (hDlg, GetLastError(), IDS_CONNECTSERVERFAILED, m_pRSOPQuery->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));
|
|
bOk = TRUE;
|
|
dwValue = 1; // Ignore errors at this point and assume that rsop is enabled on the machine
|
|
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;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::InitializeDCInfo (HWND hDlg)
|
|
// RSOP_PLANNING_MODE - ...
|
|
{
|
|
LPTSTR szDomain = NULL;
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
INT iDefault = LB_ERR, nPDC = LB_ERR, nCount = 0;
|
|
|
|
if ( m_pRSOPQuery->QueryType != RSOP_PLANNING_MODE )
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
// Determine the focused domain so we can focus on the correct DC.
|
|
// Determine the focused domain.
|
|
if ( m_pRSOPQuery->pComputer->szName != NULL )
|
|
{
|
|
// Try and get the computer's domain
|
|
szDomain = ExtractDomain( m_pRSOPQuery->pComputer->szName );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (m_pRSOPQuery->pComputer->szSOM != NULL) )
|
|
{
|
|
// Try and get the computer's domain from the SOM
|
|
szDomain = GetDomainFromSOM( m_pRSOPQuery->pComputer->szSOM );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (m_pRSOPQuery->pUser->szName != NULL) )
|
|
{
|
|
// Try and get the user's domain
|
|
szDomain = ExtractDomain( m_pRSOPQuery->pUser->szName );
|
|
}
|
|
|
|
if ( (szDomain == NULL) && (m_pRSOPQuery->pUser->szSOM != NULL) )
|
|
{
|
|
// Try and get the user's domain from the SOM
|
|
szDomain = GetDomainFromSOM( m_pRSOPQuery->pUser->szSOM );
|
|
}
|
|
|
|
if ( szDomain == NULL )
|
|
{
|
|
// Use the local domain
|
|
LPTSTR szName;
|
|
szName = MyGetUserName(NameSamCompatible);
|
|
if ( szName != NULL )
|
|
{
|
|
szDomain = ExtractDomain(szName);
|
|
LocalFree( szName );
|
|
}
|
|
}
|
|
|
|
if ( szDomain != NULL )
|
|
{
|
|
DWORD cInfo;
|
|
INT n;
|
|
PDS_DOMAIN_CONTROLLER_INFO_1 pInfo = NULL;
|
|
HANDLE hDs;
|
|
DWORD result;
|
|
ULONG uDCCount = 0;
|
|
|
|
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 (pInfo[n].DnsHostName != NULL)
|
|
{
|
|
uDCCount ++;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
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_pRSOPQuery->szDomainController != NULL )
|
|
{
|
|
iDefault = (INT) SendMessage (GetDlgItem(hDlg, IDC_LIST1), LB_FINDSTRING,
|
|
(WPARAM) -1, (LPARAM) m_pRSOPQuery->szDomainController);
|
|
}
|
|
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));
|
|
}
|
|
|
|
if (0 == uDCCount)
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeDCInfo: DsGetDomainControllerInfo to %s returned DCs with no DNS host name"), szDomain));
|
|
}
|
|
|
|
DsUnBind(&hDs);
|
|
}
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::InitializeDCInfo: DsBind to %s failed with %d."), szDomain, result));
|
|
ReportError(hDlg, result, IDS_DSBINDFAILED);
|
|
}
|
|
|
|
delete [] szDomain;
|
|
}
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
DWORD CRSOPWizardDlg::GetDefaultGroupCount()
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
VOID CRSOPWizardDlg::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[65];
|
|
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);
|
|
}
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::BuildMembershipList (HWND hLB, IDirectoryObject * pDSObj, DWORD* pdwCount, LPTSTR** paszSecGrps, DWORD** padwSecGrpAttr)
|
|
{
|
|
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;
|
|
BSTR bstrGroupType = NULL;
|
|
|
|
SetWaitCursor();
|
|
SendMessage (hLB, WM_SETREDRAW, FALSE, 0);
|
|
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
|
|
|
|
|
|
AddDefaultGroups (hLB);
|
|
if (!pDSObj)
|
|
goto BuildMembershipListEnd;
|
|
|
|
GetPrimaryGroup (hLB, pDSObj);
|
|
|
|
bstrGroupType = SysAllocString( TEXT("groupType") );
|
|
if ( bstrGroupType == NULL )
|
|
{
|
|
goto BuildMembershipListEnd;
|
|
}
|
|
|
|
//
|
|
// 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)
|
|
{
|
|
hr = StringCchCopy (lpFullName, ulSize, TEXT("LDAP://"));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat (lpFullName, ulSize, spAttrs->pADsValues[i].CaseIgnoreString);
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = OpenDSObject(lpFullName, IID_IADs, (void**)&pGroup);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (SUCCEEDED(pGroup->Get(bstrGroupType, &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.
|
|
hr = StringCchPrintf (wzMembershipAttr, ARRAYSIZE(wzMembershipAttr), wzFormat, lEnd);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
DebugMsg((DM_VERBOSE, TEXT("Range returned is %s, now asking for %s"),
|
|
spAttrs->pszAttrName, wzMembershipAttr));
|
|
}
|
|
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("Could not copy membership attributes with 0x%x"),hr));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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, pdwCount, paszSecGrps, padwSecGrpAttr);
|
|
|
|
if ( bstrGroupType != NULL )
|
|
{
|
|
SysFreeString( bstrGroupType );
|
|
}
|
|
|
|
ClearWaitCursor();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::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 = 0;
|
|
LPBYTE pObjSID = NULL;
|
|
UCHAR * psaCount, iIndex;
|
|
PSID pSID = NULL;
|
|
PSID_IDENTIFIER_AUTHORITY psia;
|
|
DWORD rgRid[8];
|
|
TCHAR szName[200];
|
|
TCHAR szDomain[300];
|
|
TCHAR *szFullName;
|
|
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))
|
|
{
|
|
ULONG ulNoChars = lstrlen(szDomain) + lstrlen(szName) + 1 + 1;
|
|
szFullName = (WCHAR *) LocalAlloc(LPTR, ulNoChars * sizeof(WCHAR));
|
|
if (szFullName != NULL)
|
|
{
|
|
hr = StringCchPrintf (szFullName, ulNoChars, TEXT("%s\\%s"), szDomain, szName);
|
|
ASSERT(SUCCEEDED(hr));
|
|
SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) szFullName);
|
|
LocalFree(szFullName);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::GetPrimaryGroup: LookupAccountSid failed with %d"), GetLastError()));
|
|
}
|
|
|
|
FreeSid (pSID);
|
|
|
|
Exit:
|
|
FreeADsMem (spAttrs);
|
|
|
|
if (pObjSID)
|
|
{
|
|
delete [] pObjSID;
|
|
}
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::SaveSecurityGroups (HWND hLB, DWORD* pdwCount, LPTSTR** paszSecGrps, DWORD** padwSecGrpAttr)
|
|
{
|
|
LONG i, lCount = 0;
|
|
DWORD dwLen;
|
|
LPTSTR lpText;
|
|
BSTR bstrText;
|
|
HRESULT hr;
|
|
|
|
|
|
if ( (*paszSecGrps != NULL) || (*padwSecGrpAttr != NULL) )
|
|
{
|
|
DebugMsg( (DM_WARNING, TEXT("CRSOPComponentData::SaveSecurityGroups: Arrays passed in are not NULL!")) );
|
|
return E_FAIL;
|
|
}
|
|
|
|
|
|
// Get number of items from list box
|
|
lCount = (LONG) SendMessage (hLB, LB_GETCOUNT, 0, 0);
|
|
if ( lCount == 0 )
|
|
{
|
|
*pdwCount = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
*paszSecGrps = (LPTSTR*)LocalAlloc( LPTR, sizeof(LPTSTR) * lCount );
|
|
if ( *paszSecGrps == NULL )
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
*padwSecGrpAttr = (DWORD*)LocalAlloc( LPTR, sizeof(DWORD) * lCount );
|
|
if ( *padwSecGrpAttr == NULL )
|
|
{
|
|
LocalFree( *paszSecGrps );
|
|
*paszSecGrps = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
*pdwCount = lCount;
|
|
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) );
|
|
|
|
// RM: Should actually do something here if memory allocation fails!
|
|
if ( lpText != NULL )
|
|
{
|
|
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
|
|
(*padwSecGrpAttr)[i] = 1;
|
|
}
|
|
|
|
(*paszSecGrps)[i] = lpText;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::FillListFromSecurityGroups(HWND hLB, DWORD dwCount, LPTSTR* aszSecurityGroups, DWORD* adwSecGrpAttr)
|
|
{
|
|
DWORD dwIndex;
|
|
LPTSTR lpText;
|
|
|
|
SetWaitCursor();
|
|
SendMessage (hLB, WM_SETREDRAW, FALSE, 0);
|
|
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
|
|
|
|
if ( (dwCount != 0) && (aszSecurityGroups != NULL) )
|
|
{
|
|
for ( dwIndex = 0; dwIndex < dwCount; dwIndex++ )
|
|
{
|
|
BOOL bDollarRemoved = FALSE;
|
|
lpText = aszSecurityGroups[dwIndex];
|
|
|
|
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 ( (adwSecGrpAttr != NULL) && (adwSecGrpAttr[dwIndex] & 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();
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
VOID CRSOPWizardDlg::FillListFromWQLFilters( HWND hLB, DWORD dwCount, LPTSTR* aszNames, LPTSTR* aszFilters )
|
|
{
|
|
INT iIndex;
|
|
DWORD dwIndex;
|
|
|
|
SetWaitCursor();
|
|
SendMessage (hLB, WM_SETREDRAW, FALSE, 0);
|
|
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
|
|
|
|
if ( dwCount != 0 )
|
|
{
|
|
for ( dwIndex = 0; dwIndex < dwCount; dwIndex++ )
|
|
{
|
|
iIndex = (INT) SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM) aszNames[dwIndex] );
|
|
DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::FillListFromSafeArrays: Added WQL filter %s"), aszNames[dwIndex]));
|
|
|
|
if (iIndex != LB_ERR)
|
|
{
|
|
SendMessage (hLB, LB_SETITEMDATA, (WPARAM) iIndex, (LPARAM) aszFilters[dwIndex] );
|
|
}
|
|
}
|
|
}
|
|
|
|
SendMessage (hLB, LB_SETCURSEL, 0, 0);
|
|
SendMessage (hLB, WM_SETREDRAW, TRUE, 0);
|
|
UpdateWindow (hLB);
|
|
ClearWaitCursor();
|
|
}
|
|
|
|
|
|
VOID CRSOPWizardDlg::BuildWQLFilterList (HWND hDlg, BOOL bUser, DWORD* pdwCount, LPTSTR** paszNames, LPTSTR** paszFilters )
|
|
{
|
|
HRESULT hr;
|
|
LPTSTR szNameSpace = NULL;
|
|
LPTSTR 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 = CRSOPWizard::GenerateRSOPData(NULL, m_pRSOPQuery, &szNameSpace, TRUE, TRUE, bUser, FALSE, &ulErrorInfo);
|
|
|
|
SendMessage (hLB, LB_RESETCONTENT, 0, 0);
|
|
|
|
if (FAILED (hr))
|
|
{
|
|
ReportError (hDlg, hr, IDS_EXECFAILED);
|
|
goto Exit;
|
|
}
|
|
|
|
|
|
ULONG ulNoChars;
|
|
|
|
ulNoChars = lstrlen(szNameSpace) + 20;
|
|
lpFullNameSpace = (LPTSTR) LocalAlloc (LPTR, ulNoChars * sizeof(TCHAR));
|
|
|
|
if (lpFullNameSpace)
|
|
{
|
|
hr = StringCchCopy (lpFullNameSpace, ulNoChars, szNameSpace);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
lpEnd = CheckSlash(lpFullNameSpace);
|
|
|
|
if (bUser)
|
|
{
|
|
hr = StringCchCopy (lpEnd, ulNoChars - lstrlen(lpFullNameSpace), TEXT("User"));
|
|
}
|
|
else
|
|
{
|
|
hr = StringCchCopy (lpEnd, ulNoChars - lstrlen(lpFullNameSpace), TEXT("Computer"));
|
|
}
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (SUCCEEDED(ExtractWQLFilters (lpFullNameSpace, pdwCount, paszNames, paszFilters) ))
|
|
{
|
|
FillListFromWQLFilters( hLB, *pdwCount, *paszNames, *paszFilters );
|
|
}
|
|
}
|
|
|
|
LocalFree (lpFullNameSpace);
|
|
}
|
|
|
|
CRSOPWizard:: DeleteRSOPData( szNameSpace, m_pRSOPQuery );
|
|
LocalFree( szNameSpace );
|
|
|
|
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();
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::SaveWQLFilters (HWND hLB, DWORD* pdwCount, LPTSTR** paszNames, LPTSTR**paszFilters )
|
|
{
|
|
LONG i, lLength, lCount = 0;
|
|
LPTSTR lpText, lpName;
|
|
BSTR bstrText;
|
|
HRESULT hr;
|
|
|
|
if ( (*paszNames != NULL) || (*paszFilters != NULL) )
|
|
{
|
|
DebugMsg( (DM_WARNING, TEXT("CRSOPComponentData::SaveWQLFilters: Arrays passed in are not NULL!")) );
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Getting the number of items
|
|
lCount = (LONG) SendMessage (hLB, LB_GETCOUNT, 0, 0);
|
|
if ( lCount == 0 )
|
|
{
|
|
*pdwCount = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
*paszNames = (LPTSTR*)LocalAlloc( LPTR, sizeof(LPTSTR) * lCount );
|
|
if ( *paszNames == NULL )
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
*paszFilters = (LPTSTR*)LocalAlloc( LPTR, sizeof(LPTSTR) * lCount );
|
|
if ( *paszFilters == NULL )
|
|
{
|
|
LocalFree( *paszNames );
|
|
*paszNames = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
*pdwCount = lCount;
|
|
for ( i = 0; i < lCount; i++ )
|
|
{
|
|
lLength = (LONG) SendMessage (hLB, LB_GETTEXTLEN, (WPARAM) i, 0);
|
|
|
|
lpName = (LPTSTR)LocalAlloc( LPTR, sizeof(TCHAR) * (lLength + 1) );
|
|
|
|
if ( lpName != NULL )
|
|
{
|
|
if (SendMessage (hLB, LB_GETTEXT, (WPARAM) i, (LPARAM) lpName) != LB_ERR)
|
|
{
|
|
(*paszNames)[i] = lpName;
|
|
|
|
lpText = (LPTSTR) SendMessage (hLB, LB_GETITEMDATA, (WPARAM) i, 0);
|
|
|
|
if (lpText)
|
|
{
|
|
ULONG ulNoChars = wcslen(lpText) + 1;
|
|
|
|
(*paszFilters)[i] = (LPTSTR)LocalAlloc( LPTR, sizeof(TCHAR) * ulNoChars );
|
|
if ( (*paszFilters)[i] != NULL )
|
|
{
|
|
hr = StringCchCopy( (*paszFilters)[i], ulNoChars, lpText );
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LocalFree( lpName );
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
BOOL CRSOPWizardDlg::CompareStringLists( DWORD dwCountA, LPTSTR* aszListA, DWORD dwCountB, LPTSTR* aszListB )
|
|
{
|
|
BOOL bFound;
|
|
DWORD dwA, dwB;
|
|
|
|
//
|
|
// Parameter checks
|
|
//
|
|
if ( dwCountA != dwCountB )
|
|
{
|
|
return FALSE;
|
|
}
|
|
if ( (dwCountA == 0) && (dwCountB == 0) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if ( dwCountA == 0 )
|
|
{
|
|
return FALSE;
|
|
}
|
|
if ( dwCountB == 0 )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if ( (aszListA == NULL) || (aszListB == NULL) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Loop through comparing item by item
|
|
//
|
|
for ( dwA = 0; dwA < dwCountA; dwA++ )
|
|
{
|
|
bFound = FALSE;
|
|
|
|
for ( dwB = 0; dwB < dwCountB; dwB++ )
|
|
{
|
|
if ( !lstrcmpi( aszListA[dwA], aszListB[dwB] ) )
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
|
|
if (!bFound)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
LPTSTR CRSOPWizardDlg::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
|
|
//
|
|
|
|
BSTR bstrDNName = SysAllocString( lpDNName );
|
|
if ( bstrDNName == NULL )
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildAltDirPath: Failed to allocate BSTR memory.")));
|
|
hr = E_OUTOFMEMORY;
|
|
goto Exit;
|
|
}
|
|
hr = pADsPathname->Set (bstrDNName, ADS_SETTYPE_DN);
|
|
SysFreeString( bstrDNName );
|
|
|
|
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
|
|
//
|
|
|
|
ULONG ulNoChars = lstrlen(bstrContainer)+ 1;
|
|
lpPath = new TCHAR [ulNoChars];
|
|
|
|
if (!lpPath)
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::BuildAltDirPath: Failed to allocate memory with %d"), GetLastError()));
|
|
goto Exit;
|
|
}
|
|
|
|
|
|
//
|
|
// Build the path
|
|
//
|
|
|
|
hr = StringCchCopy (lpPath, ulNoChars, bstrContainer);
|
|
ASSERT(SUCCEEDED(hr));
|
|
|
|
Exit:
|
|
|
|
if (bstrContainer)
|
|
{
|
|
SysFreeString (bstrContainer);
|
|
}
|
|
|
|
if (pADsPathname)
|
|
{
|
|
pADsPathname->Release();
|
|
}
|
|
|
|
return lpPath;
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
|
|
HRESULT CRSOPWizardDlg::TestSOM (LPTSTR lpSOM, HWND hDlg)
|
|
{
|
|
HRESULT hr = E_OUTOFMEMORY;
|
|
LPTSTR lpFullName;
|
|
IDirectoryObject * pObject;
|
|
ADS_OBJECT_INFO *pInfo;
|
|
|
|
|
|
if (!lpSOM)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
ULONG ulNoChars = lstrlen(lpSOM) + 10;
|
|
|
|
lpFullName = (LPTSTR) LocalAlloc (LPTR, ulNoChars * sizeof(TCHAR));
|
|
|
|
if (lpFullName)
|
|
{
|
|
hr = StringCchCopy (lpFullName, ulNoChars, TEXT("LDAP://"));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchCat (lpFullName, ulNoChars, lpSOM);
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::TestSOM: Could not copy SOM name with 0x%x"), hr));
|
|
LocalFree(lpFullName);
|
|
return hr;
|
|
}
|
|
|
|
hr = OpenDSObject(lpFullName, IID_IDirectoryObject, (void**)&pObject);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pObject->GetObjectInformation (&pInfo);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (CompareString (LOCALE_INVARIANT, NORM_IGNORECASE, pInfo->pszClassName, -1, TEXT("user"), -1) == CSTR_EQUAL)
|
|
{
|
|
hr = E_INVALIDARG;
|
|
ReportError (hDlg, hr, IDS_BADUSERSOM);
|
|
}
|
|
else if (CompareString (LOCALE_INVARIANT, NORM_IGNORECASE, pInfo->pszClassName, -1, TEXT("computer"), -1) == CSTR_EQUAL)
|
|
{
|
|
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;
|
|
}
|
|
|