Aktivieren von Schemaänderungen im Schemamaster
Standardmäßig ist die Schemaänderung auf allen Windows 2000-Domänencontrollern deaktiviert. Die Möglichkeit, das Schema zu aktualisieren, wird durch den folgenden Registrierungswert auf dem Schema master Domänencontroller gesteuert:
HKEY_LOCAL_MACHINE
System
CurrentControlSet
Services
NTDS
Parameters
Schema Update Allowed
Dieser Registrierungswert ist ein REG_DWORD Wert. Wenn dieser Wert nicht vorhanden ist oder null (0) enthält, ist die Schemaänderung deaktiviert. Wenn dieser Wert vorhanden ist und einen anderen Wert als Null enthält, ist die Schemaänderung aktiviert.
Das MMC-Snap-In schema-Manager bietet dem Benutzer die Möglichkeit, die Schemaänderung manuell zu aktivieren oder zu deaktivieren. Die Schemaänderung kann programmgesteuert aktiviert oder deaktiviert werden, indem dieser Registrierungswert auf dem Schema master Domänencontroller geändert wird.
Die folgende C++-Funktion zeigt, wie Ermittelt werden kann, ob das Schema für ein angegebenes Schema master geändert werden kann.
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;
}
Die folgende C++-Funktion zeigt, wie Die Schemaänderung für ein angegebenes Schema master aktiviert oder deaktiviert wird.
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;
}