windows-nt/Source/XPSP1/NT/ds/security/tools/ksetup/servers.cxx
2020-09-26 16:20:57 +08:00

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 );
}