windows-nt/Source/XPSP1/NT/admin/wizards/addgrpw/where.cpp
2020-09-26 16:20:57 +08:00

299 lines
7 KiB
C++

/**********************************************************************/
/** 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();
}