在架构主机上启用架构更改
默认情况下,在所有 Windows 2000 域控制器上禁用架构修改。 更新架构的功能由架构主机域控制器上的以下注册表值控制:
HKEY_LOCAL_MACHINE
System
CurrentControlSet
Services
NTDS
Parameters
Schema Update Allowed
此注册表值是 REG_DWORD 值。 如果此值不存在或包含零 (0),则禁用架构修改。 如果此值存在并且包含除零以外的值,则启用架构修改。
架构管理器 MMC 管理单元将让用户能够手动启用或禁用架构修改。 通过修改架构主机域控制器上的此注册表值,可以以编程方式启用或禁用架构修改。
以下 C++ 函数演示如何确定是否可以在指定的架构主机上修改架构。
HRESULT IsSchemaUpdateEnabled(
LPTSTR pszSchemaMasterComputerName,
BOOL *pfEnabled)
{
*pfEnabled = FALSE;
LPTSTR szPrefix = "\\\\";
LPTSTR pszPath = new TCHAR[lstrlen(szPrefix) +
lstrlen(pszSchemaMasterComputerName) + 1];
if(!pszPath)
{
return E_OUTOFMEMORY;
}
HRESULT hr = E_FAIL;
LONG lReturn;
HKEY hKeyMachine;
tcscpy_s(pszPath, szPrefix);
tcscat_s(pszPath, pszSchemaMasterComputerName);
lReturn = RegConnectRegistry(
pszPath,
HKEY_LOCAL_MACHINE,
&hKeyMachine);
delete [] pszPath;
if (ERROR_SUCCESS == lReturn)
{
HKEY hKeyParameters;
LPTSTR szKeyPath =
TEXT("System\\CurrentControlSet\\Services\\NTDS\\Parameters");
LPTSTR szValueName = TEXT("Schema Update Allowed");
lReturn = RegOpenKeyEx(
hKeyMachine,
szKeyPath,
0,
KEY_READ,
&hKeyParameters);
if (ERROR_SUCCESS == lReturn)
{
DWORD dwType;
DWORD dwValue;
DWORD dwSize;
dwSize = sizeof(dwValue);
lReturn = RegQueryValueEx(
hKeyParameters,
szValueName,
0,
&dwType,
(LPBYTE)&dwValue,
&dwSize);
if (ERROR_SUCCESS == lReturn)
{
*pfEnabled = (0 != dwValue);
hr = S_OK;
}
RegCloseKey(hKeyParameters);
}
RegCloseKey(hKeyMachine);
}
return hr;
}
以下 C++ 函数演示如何在指定的架构主机上启用或禁用架构修改。
HRESULT EnableSchemaUpdate(
LPTSTR pszSchemaMasterComputerName,
BOOL fEnabled)
{
LPTSTR szPrefix = "\\\\";
LPTSTR pszPath = new TCHAR[lstrlen(szPrefix) +
lstrlen(pszSchemaMasterComputerName) + 1];
if(!pszPath)
{
return E_OUTOFMEMORY;
}
HRESULT hr = E_FAIL;
LONG lReturn;
HKEY hKeyMachine;
strcpy_s(pszPath, szPrefix);
strcat_s(pszPath, pszSchemaMasterComputerName);
lReturn = RegConnectRegistry(
pszPath,
HKEY_LOCAL_MACHINE,
&hKeyMachine);
delete [] pszPath;
if (ERROR_SUCCESS == lReturn)
{
HKEY hKeyParameters;
LPTSTR szRelKeyPath =
TEXT("System\\CurrentControlSet\\Services\\NTDS\\Parameters");
LPTSTR szValueName = TEXT("Schema Update Allowed");
lReturn = RegOpenKeyEx(
hKeyMachine,
szRelKeyPath,
0,
KEY_SET_VALUE,
&hKeyParameters);
if (ERROR_SUCCESS == lReturn)
{
DWORD dwValue;
DWORD dwSize;
if(fEnabled)
{
dwValue = 1;
}
else
{
dwValue = 0;
}
dwSize = sizeof(dwValue);
lReturn = RegSetValueEx(
hKeyParameters,
szValueName,
0L,
REG_DWORD,
(LPBYTE)&dwValue,
dwSize);
if (ERROR_SUCCESS == lReturn)
{
hr = S_OK;
}
RegCloseKey(hKeyParameters);
}
RegCloseKey(hKeyMachine);
}
return hr;
}