|
|
/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corp., 1991-1996 **/ /**********************************************************************/
/*
where.cpp
Property Page support for Group management wizard FILE HISTORY: jony Apr-1996 created */
#include "stdafx.h"
#include "Romaine.h"
#include "NetTree.h"
#include "Where.h"
#include <winreg.h>
#include <lmcons.h>
#include <lmaccess.h>
#include <lmerr.h>
#include <lmapibuf.h>
#include <winnetwk.h>
#include <lmserver.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
unsigned int WhichNTProduct(CString& lpMachineName); int ClassifyMachine(CString& csMachineName);
/////////////////////////////////////////////////////////////////////////////
// CWhere property page
IMPLEMENT_DYNCREATE(CWhere, CPropertyPage)
CWhere::CWhere() : CPropertyPage(CWhere::IDD) { //{{AFX_DATA_INIT(CWhere)
m_csMachineName = _T(""); //}}AFX_DATA_INIT
m_bExpandedOnce = 0; }
CWhere::~CWhere() { }
void CWhere::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWhere)
DDX_Control(pDX, IDC_SERVER_TREE, m_ctServerTree); DDX_Text(pDX, IDC_MACHINE_NAME, m_csMachineName); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWhere, CPropertyPage) //{{AFX_MSG_MAP(CWhere)
ON_WM_SHOWWINDOW() ON_NOTIFY(TVN_SELCHANGED, IDC_SERVER_TREE, OnSelchangedServerTree) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWhere message handlers
LRESULT CWhere::OnWizardNext() { UpdateData(TRUE);
if (m_csMachineName == "") { AfxMessageBox(IDS_NO_MACHINE_NAME); CWnd* pWnd = GetDlgItem(IDC_MACHINE_NAME); pWnd->SetFocus(); return -1; }
int nVal = ClassifyMachine(m_csMachineName);
CRomaineApp* pApp = (CRomaineApp*)AfxGetApp(); pApp->m_csServer = m_csMachineName; // go ahead and check the name for uniqueness
TCHAR* pServer = m_csMachineName.GetBuffer(m_csMachineName.GetLength()); m_csMachineName.ReleaseBuffer();
TCHAR* pGroupName = pApp->m_csGroupName.GetBuffer(pApp->m_csGroupName.GetLength()); pApp->m_csGroupName.ReleaseBuffer();
GROUP_INFO_0* pInfo; NET_API_STATUS nAPI = NetGroupGetInfo(pServer, pGroupName, 0, (LPBYTE*)&pInfo);
if (nAPI == ERROR_SUCCESS) { AfxMessageBox(IDS_GROUP_EXISTS); return IDD_NAME_DLG; }
LOCALGROUP_INFO_0* pLInfo; nAPI = NetLocalGroupGetInfo(pServer, pGroupName, 0, (LPBYTE*)&pLInfo);
if (nAPI == ERROR_SUCCESS) { AfxMessageBox(IDS_GROUP_EXISTS); return IDD_NAME_DLG; }
return nVal;
}
int ClassifyMachine(CString& csMachineName) { UINT ui; HKEY hKey; DWORD dwRet; DWORD cbProv = 0;
CRomaineApp* pApp = (CRomaineApp*)AfxGetApp(); csMachineName.MakeUpper(); // if a machine name is entered we need to know the domain
// if a domain name is entered we need to know the DC name
if (csMachineName.Left(2) == "\\\\") { pApp->m_bDomain = FALSE; ui = WhichNTProduct(csMachineName); // depending on the server type, provide an option for group type
if ((ui == 2) || (ui == 1)) // standalone server or wks
{ pApp->m_bServer = FALSE; pApp->m_csServer = csMachineName; pApp->m_nGroupType = 1; if (pApp->m_sMode == 0) return IDD_LOCAL_USERS; else return IDD_GROUP_LIST_DIALOG; } else if (ui == 3) //pdc \ bdc
{ AfxMessageBox(IDS_DOMAIN_SET);
// find out what domain this is a server for
TCHAR* lpProv = NULL;
CRomaineApp* pApp = (CRomaineApp*)AfxGetApp(); long lRet = RegConnectRegistry( (LPTSTR)csMachineName.GetBuffer(csMachineName.GetLength()), HKEY_LOCAL_MACHINE, &hKey); dwRet = RegOpenKey(hKey, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hKey );
TCHAR* lpPrimaryDomain = NULL; if ((dwRet = RegQueryValueEx( hKey, TEXT("CachePrimaryDomain"), NULL, NULL, NULL, &cbProv )) == ERROR_SUCCESS) { lpPrimaryDomain = (TCHAR*)malloc(cbProv); if (lpPrimaryDomain == NULL) { AfxMessageBox(IDS_GENERIC_NO_HEAP, MB_ICONEXCLAMATION); ExitProcess(1); }
dwRet = RegQueryValueEx( hKey, TEXT("CachePrimaryDomain"), NULL, NULL, (LPBYTE) lpPrimaryDomain, &cbProv );
}
RegCloseKey(hKey);
TCHAR* lpszPrimaryDC; DWORD err = NetGetDCName(NULL, lpPrimaryDomain, // Domain Name
(LPBYTE *)&lpszPrimaryDC ); // returned PDC *
pApp->m_csDomain = lpPrimaryDomain; pApp->m_csServer = lpszPrimaryDC; pApp->m_bDomain = TRUE; pApp->m_bServer = FALSE; free(lpPrimaryDomain); if (pApp->m_sMode == 0) return IDD_GROUP_TYPE_DLG; else return IDD_GROUP_LIST_DIALOG; } else { AfxMessageBox(IDS_GENERIC_BAD_MACHINE); return -1; } }
else { pApp->m_bDomain = TRUE; pApp->m_bServer = FALSE; TCHAR* lpszPrimaryDC; TCHAR* lpwDomain = csMachineName.GetBuffer(csMachineName.GetLength()); DWORD err = NetGetDCName(NULL, lpwDomain, // Domain Name
(LPBYTE *)&lpszPrimaryDC ); // returned PDC *
csMachineName.ReleaseBuffer();
if (err == 2453) { AfxMessageBox(IDS_NO_DC); return -1; }
pApp->m_csDomain = csMachineName; pApp->m_csServer = lpszPrimaryDC; if (pApp->m_sMode == 0) return IDD_GROUP_TYPE_DLG; else return IDD_GROUP_LIST_DIALOG; } return -1; } // given a machine name, return whether its a server or wks
unsigned int WhichNTProduct(CString& csMachineName) { UINT uiRetVal = 0; PSERVER_INFO_101 si101; NET_API_STATUS nas;
nas = NetServerGetInfo( (LPTSTR)csMachineName.GetBuffer(csMachineName.GetLength()), 101, // info-level
(LPBYTE *)&si101 );
if(nas != NERR_Success) { NetApiBufferFree(si101); SetLastError(nas); return 0; }
if( (si101->sv101_type & SV_TYPE_DOMAIN_CTRL) || (si101->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) ) uiRetVal = 3; else if (si101->sv101_type & SV_TYPE_WORKSTATION) uiRetVal = 2; //wks
else if (si101->sv101_type & SV_TYPE_SERVER) uiRetVal = 1; // server
NetApiBufferFree(si101); // else return Unknown
return uiRetVal; }
void CWhere::OnShowWindow(BOOL bShow, UINT nStatus) { CPropertyPage::OnShowWindow(bShow, nStatus); // Do the default domain expansion only once.
if ((bShow) && (!m_bExpandedOnce)) { m_bExpandedOnce = TRUE; m_ctServerTree.PopulateTree(); } }
void CWhere::OnSelchangedServerTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = m_ctServerTree.GetSelectedItem();
int nImage; m_ctServerTree.GetItemImage(hItem, nImage, nImage); if (nImage > 0) { CString csName; csName = m_ctServerTree.GetItemText(hItem); m_csMachineName = csName; } UpdateData(FALSE);
*pResult = 0; }
LRESULT CWhere::OnWizardBack() { CRomaineApp* pApp = (CRomaineApp*)AfxGetApp(); if (pApp->m_sMode == 1) return IDD_WELCOME_DLG; else return CPropertyPage::OnWizardBack(); }
|