313 lines
6.4 KiB
C++
313 lines
6.4 KiB
C++
|
/*++
|
||
|
|
||
|
SERVERS.CXX
|
||
|
|
||
|
Copyright (C) 1999 Microsoft Corporation, all rights reserved.
|
||
|
|
||
|
DESCRIPTION: adding/removing servers
|
||
|
|
||
|
Created, May 21, 1999 by DavidCHR.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "everything.hxx"
|
||
|
|
||
|
NTSTATUS
|
||
|
RemoveDomainName( IN LPWSTR *pRealmToRemove ) {
|
||
|
|
||
|
LPWSTR TargetRealm = *pRealmToRemove;
|
||
|
DWORD dwErr;
|
||
|
HKEY hDomainsKey;
|
||
|
NTSTATUS N = STATUS_UNSUCCESSFUL;
|
||
|
|
||
|
dwErr = OpenSubKey( NULL,
|
||
|
&hDomainsKey );
|
||
|
|
||
|
if ( ERROR_SUCCESS == dwErr ) {
|
||
|
|
||
|
dwErr = RegDeleteKeyW( hDomainsKey,
|
||
|
TargetRealm );
|
||
|
|
||
|
switch( dwErr ) {
|
||
|
|
||
|
case ERROR_SUCCESS:
|
||
|
|
||
|
N = STATUS_SUCCESS;
|
||
|
break;
|
||
|
|
||
|
case ERROR_FILE_NOT_FOUND:
|
||
|
case ERROR_PATH_NOT_FOUND:
|
||
|
|
||
|
printf( "No realm mappings found for %ws.\n",
|
||
|
TargetRealm );
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
|
||
|
printf( "Failed to delete registry mapping for %ws. Error 0x%x.\n",
|
||
|
TargetRealm,
|
||
|
dwErr );
|
||
|
|
||
|
}
|
||
|
|
||
|
RegCloseKey( hDomainsKey );
|
||
|
|
||
|
} // else an error was already logged.
|
||
|
|
||
|
return N;
|
||
|
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
RemoveServerName( IN LPWSTR *Parameters,
|
||
|
IN LPWSTR KeyName,
|
||
|
OUT PBOOL pbDeletedLastEntry OPTIONAL ) {
|
||
|
|
||
|
DWORD RegErr;
|
||
|
HKEY DomainHandle = NULL;
|
||
|
DWORD Disposition;
|
||
|
LPWSTR OldServerNames = NULL;
|
||
|
LPWSTR NewServerNames = NULL;
|
||
|
ULONG TotalKdcLength, OldKdcLength = 0;
|
||
|
ULONG NewKdcLength = 0;
|
||
|
ULONG Type, Length;
|
||
|
BOOL PrintedNewServers = FALSE;
|
||
|
CMULTISTRING StringClass;
|
||
|
|
||
|
RegErr = OpenSubKey( Parameters,
|
||
|
&DomainHandle );
|
||
|
if (RegErr)
|
||
|
{
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
RegErr = STATUS_UNSUCCESSFUL;
|
||
|
|
||
|
if ( StringClass.ReadFromRegistry( DomainHandle,
|
||
|
KeyName ) ) {
|
||
|
|
||
|
if ( StringClass.RemoveString( Parameters[ 1 ] ) ) {
|
||
|
|
||
|
if ( StringClass.WriteToRegistry( DomainHandle,
|
||
|
KeyName ) ) {
|
||
|
|
||
|
RegErr = ERROR_SUCCESS;
|
||
|
if ( pbDeletedLastEntry ) {
|
||
|
*pbDeletedLastEntry = ( StringClass.cEntries == 0 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
Cleanup:
|
||
|
if (NewServerNames)
|
||
|
{
|
||
|
LocalFree(NewServerNames);
|
||
|
}
|
||
|
if (OldServerNames)
|
||
|
{
|
||
|
LocalFree(OldServerNames);
|
||
|
}
|
||
|
if (DomainHandle)
|
||
|
{
|
||
|
RegCloseKey(DomainHandle);
|
||
|
}
|
||
|
|
||
|
if (RegErr)
|
||
|
{
|
||
|
return(STATUS_UNSUCCESSFUL);
|
||
|
}
|
||
|
return(STATUS_SUCCESS);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
AddServerName(IN LPWSTR * Parameters,
|
||
|
IN LPWSTR KeyName
|
||
|
)
|
||
|
{
|
||
|
DWORD RegErr;
|
||
|
HKEY KerbHandle = NULL;
|
||
|
HKEY DomainHandle = NULL;
|
||
|
HKEY DomainRoot = NULL;
|
||
|
DWORD Disposition;
|
||
|
LPWSTR OldServerNames = NULL;
|
||
|
LPWSTR NewServerNames = NULL;
|
||
|
ULONG OldKdcLength = 0;
|
||
|
ULONG NewKdcLength = 0;
|
||
|
ULONG Type;
|
||
|
CMULTISTRING StringClass;
|
||
|
|
||
|
RegErr = OpenSubKey( Parameters,
|
||
|
&DomainHandle );
|
||
|
if (RegErr)
|
||
|
{
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
RegErr = STATUS_UNSUCCESSFUL;
|
||
|
|
||
|
if ( StringClass.ReadFromRegistry( DomainHandle,
|
||
|
KeyName ) ) {
|
||
|
|
||
|
StringClass.AddString( Parameters[ 1 ] );
|
||
|
|
||
|
if ( StringClass.WriteToRegistry( DomainHandle,
|
||
|
KeyName ) ) {
|
||
|
|
||
|
RegErr = ERROR_SUCCESS;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
Cleanup:
|
||
|
if (NewServerNames)
|
||
|
{
|
||
|
LocalFree(NewServerNames);
|
||
|
}
|
||
|
if (OldServerNames)
|
||
|
{
|
||
|
LocalFree(OldServerNames);
|
||
|
}
|
||
|
if (DomainHandle)
|
||
|
{
|
||
|
RegCloseKey(DomainHandle);
|
||
|
}
|
||
|
if (DomainRoot)
|
||
|
{
|
||
|
RegCloseKey(DomainRoot);
|
||
|
}
|
||
|
if (KerbHandle)
|
||
|
{
|
||
|
RegCloseKey(KerbHandle);
|
||
|
}
|
||
|
if (RegErr)
|
||
|
{
|
||
|
return(STATUS_UNSUCCESSFUL);
|
||
|
}
|
||
|
return(STATUS_SUCCESS);
|
||
|
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
AddKdcName(
|
||
|
LPWSTR * Parameters
|
||
|
)
|
||
|
{
|
||
|
if( !CheckUppercase( Parameters[0] ) )
|
||
|
{
|
||
|
return STATUS_UNSUCCESSFUL;
|
||
|
}
|
||
|
|
||
|
if( Parameters[1] == NULL )
|
||
|
{
|
||
|
HKEY DomainHandle = NULL;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
Status = OpenSubKey( Parameters, &DomainHandle );
|
||
|
if( DomainHandle )
|
||
|
{
|
||
|
RegCloseKey( DomainHandle );
|
||
|
}
|
||
|
return Status;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return(AddServerName(Parameters, KERB_DOMAIN_KDC_NAMES_VALUE));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
DeleteKdcName( IN LPWSTR * Parameters ) {
|
||
|
|
||
|
NTSTATUS N;
|
||
|
BOOL bLastOne, bRemoveFromDomain;
|
||
|
PPOLICY_DNS_DOMAIN_INFO DnsDomainInfo = NULL;
|
||
|
UNICODE_STRING tempDomain;
|
||
|
|
||
|
if( Parameters[1] == NULL )
|
||
|
{
|
||
|
return( RemoveDomainName( Parameters ) );
|
||
|
}
|
||
|
|
||
|
N = RemoveServerName( Parameters,
|
||
|
KERB_DOMAIN_KDC_NAMES_VALUE,
|
||
|
&bLastOne );
|
||
|
|
||
|
if ( NT_SUCCESS( N ) && bLastOne ) {
|
||
|
|
||
|
fprintf( stderr,
|
||
|
"NOTE: no kdc's are currently defined for the %ws realm.\n",
|
||
|
Parameters[ 0 ] );
|
||
|
|
||
|
/* we removed the last KDC; check to see if we're directly "joined"
|
||
|
to this domain. */
|
||
|
|
||
|
N = LsaQueryInformationPolicy( LsaHandle,
|
||
|
PolicyDnsDomainInformation,
|
||
|
(PVOID *) &DnsDomainInfo
|
||
|
);
|
||
|
|
||
|
if ( NT_SUCCESS( N ) ) {
|
||
|
|
||
|
RtlInitUnicodeString( &tempDomain,
|
||
|
Parameters[ 0 ] );
|
||
|
|
||
|
if ( RtlCompareUnicodeString( &tempDomain,
|
||
|
&DnsDomainInfo->DnsDomainName,
|
||
|
TRUE ) // case insensitive
|
||
|
== 0 ) {
|
||
|
|
||
|
if ( DnsDomainInfo->Sid != NULL ) {
|
||
|
|
||
|
fprintf( stderr,
|
||
|
"NOTE: %wZ is an NT domain.\n"
|
||
|
" If you want to leave the domain, use the SYSTEM Control Panel applet.\n",
|
||
|
&DnsDomainInfo->DnsDomainName );
|
||
|
|
||
|
} else {
|
||
|
|
||
|
// this was our primary domain. Unjoin from it.
|
||
|
|
||
|
}
|
||
|
|
||
|
} // else, this was not our primary domain. Do nothing further.
|
||
|
|
||
|
|
||
|
LsaFreeMemory( DnsDomainInfo );
|
||
|
|
||
|
} else {
|
||
|
|
||
|
fprintf( stderr,
|
||
|
"Unable to determine domain membership (error 0x%x).\n",
|
||
|
N );
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return N;
|
||
|
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
AddKpasswdName(
|
||
|
LPWSTR * Parameters
|
||
|
)
|
||
|
{
|
||
|
return(AddServerName(Parameters, KERB_DOMAIN_KPASSWD_NAMES_VALUE));
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
DelKpasswdName( IN LPWSTR * Parameters ) {
|
||
|
|
||
|
return RemoveServerName( Parameters,
|
||
|
KERB_DOMAIN_KPASSWD_NAMES_VALUE,
|
||
|
NULL );
|
||
|
|
||
|
}
|