| Platform SDK: Active Directory, ADSI, and Directory Services |
Schema modification is disabled by default on all Windows 2000 domain controllers. To enable schema modification at a particular DC, you must insert a value (or ensure that it is greater than zero if it already exists) into the registry on that DC. You must add the value "Schema Update Allowed" as a REG_DWORD value and set the value to 1 (or any value greater than 0). This value must be added to the following registry key:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\Parameters
Note that If the "Schema Update Allowed" registry value is set to zero (0), then schema modification is turned off.
The Schema Manager MMC snap-in provides a checkbox that sets or clears this registry key.
Example
The following function does checks and if necessary sets the Schema Update Allowed value:
HRESULT IsSchemaMasterWritable(LPOLESTR szSchemaMasterComputerName)
{
if (!szSchemaMasterComputerName)
return E_POINTER;
HRESULT hr = E_FAIL;
LONG lReturn;
HKEY hKey,hKeyTarget;
LPOLESTR szRelKeyPath = L"System\\CurrentControlSet\\Services\\NTDS\\Parameters";
LPOLESTR szValueName = L"Schema Update Allowed";
LPOLESTR szPath = new OLECHAR[MAX_PATH];
LPOLESTR szBuffer = new OLECHAR[MAX_PATH];
ULONG lSize = sizeof(DWORD);
DWORD dwType,dwValue;
wcscpy(szPath,L"\\\\");
wcscat(szPath,szSchemaMasterComputerName);
lReturn = RegConnectRegistry(szPath,HKEY_LOCAL_MACHINE,&hKey);
if (ERROR_SUCCESS==lReturn)
{
lReturn = RegOpenKeyEx(hKey,szRelKeyPath,0,KEY_READ,&hKeyTarget);
if (ERROR_SUCCESS==lReturn)
{
lReturn = RegQueryValueEx(hKeyTarget,szValueName,0,&dwType,(LPBYTE)&dwValue,&lSize);
if (ERROR_SUCCESS==lReturn)
{
if (dwValue>0)
hr = S_OK;
else
hr = S_FALSE;
}
//if the value could not be found, return S_FALSE.
else if (ERROR_FILE_NOT_FOUND==lReturn)
{
hr = S_FALSE;
}
if (S_FALSE==hr)
{
RegCloseKey(hKeyTarget);
int iSetIfNotWritable = MessageBox(NULL,L"The schema master is not writeable. Do you want to make it writeable?",L"Extend Schema Wizard",MB_YESNO|MB_ICONEXCLAMATION);
if (iSetIfNotWritable==IDYES)
{
lReturn = RegOpenKeyEx(hKey,szRelKeyPath,0,KEY_WRITE,&hKeyTarget);
if (ERROR_SUCCESS==lReturn)
{
//Set the value to 1.
dwValue = 1L;
lReturn = RegSetValueEx(hKeyTarget,szValueName,0L,REG_DWORD,(LPBYTE)&dwValue,lSize);
if (ERROR_SUCCESS==lReturn)
{
hr = S_OK;
}
else
{
MessageBox(NULL,L"Could not set the Schema Master as writeable.",L"Extend Schema Wizard",MB_OK|MB_ICONEXCLAMATION);
}
}
}
}
}
RegCloseKey(hKeyTarget);
}
RegCloseKey(hKey);
return hr;
}