/*++ DMPSTATE.CXX Copyright (C) 1999 Microsoft Corporation, all rights reserved. DESCRIPTION: code and support for DumpState() Created, May 21, 1999 by DavidCHR. --*/ #include "everything.hxx" extern NTSTATUS // realmflags.cxx GetRealmFlags( IN LPWSTR RealmName, OUT PULONG pulRealmFlags ); extern VOID // realmflags.cxx PrintRealmFlags( IN ULONG RealmFlags ); DWORD LoadAndPrintNames( IN LPSTR KeyName, IN HKEY DomainKey, IN BOOL bPrintEmptyIfMissing, IN LPWSTR ValueName ) { ULONG KdcNameSize = 0, i; LPWSTR KdcNames; DWORD WinError = STATUS_UNSUCCESSFUL; DWORD Type; CMULTISTRING StringClass; if ( StringClass.ReadFromRegistry( DomainKey, ValueName ) ) { if ( StringClass.cEntries != 0 ) { for ( i = 0 ; i < StringClass.cEntries ; i ++ ) { printf( "\t%hs = %ws\n", KeyName, StringClass.pEntries[ i ] ); } } else { if ( bPrintEmptyIfMissing ) { printf( "\t(no %hs entries for this realm)\n", KeyName ); } } } return WinError; } NTSTATUS PrintRealmList( VOID ) { NTSTATUS Status = STATUS_SUCCESS; ULONG WinError; HKEY DomainRootKey = NULL; HKEY DomainKey = NULL; LPWSTR KdcNames = NULL; LPWSTR AlternateRealmNames = NULL; TCHAR DomainName[128]; // max domain name length ULONG Index,Index2; ULONG Type; ULONG NameSize; ULONG KdcNameSize = 0; ULONG AltRealmSize = 0; LPWSTR Where; ULONG NameCount; UNICODE_STRING TempString; ULONG RealmFlags; // // Open the domains root key - if it is not there, so be it. // WinError = RegOpenKey( HKEY_LOCAL_MACHINE, KERB_DOMAINS_KEY, &DomainRootKey ); switch( WinError ) { case ERROR_FILE_NOT_FOUND: printf( "(No RFC1510 Kerberos Realms are defined).\n" ); goto Cleanup; case ERROR_SUCCESS: break; default: printf("Failed to open key %ws: 0x%x\n", KERB_DOMAINS_KEY, WinError ); goto Cleanup; } // // If it is there, we now want to enumerate all the child keys. // Index = 0; for (Index = 0; TRUE ; Index++ ) { // // Enumerate through all the keys // NameSize = sizeof(DomainName) / sizeof( DomainName[ 0 ] ); WinError = RegEnumKeyEx( DomainRootKey, Index, DomainName, &NameSize, NULL, NULL, NULL, NULL ); if (WinError != ERROR_SUCCESS) { if ( WinError != ERROR_NO_MORE_ITEMS ) { printf( "Registry error 0x%x while enumerating domains. Stopping here.\n", WinError ); } break; } // // Open the domain key to tread the values under it // WinError = RegOpenKey( DomainRootKey, DomainName, &DomainKey ); if (WinError != ERROR_SUCCESS) { printf("Failed to open key %ws \\ %ws: 0x%x\n", KERB_DOMAINS_KEY, DomainName, WinError ); break; } printf( "%ws:\n", DomainName ); LoadAndPrintNames( "kdc", DomainKey, TRUE, KERB_DOMAIN_KDC_NAMES_VALUE ); LoadAndPrintNames( "AlternateRealmName", DomainKey, FALSE, KERB_DOMAIN_ALT_NAMES_VALUE ); LoadAndPrintNames( "kpasswd", DomainKey, FALSE, KERB_DOMAIN_KPASSWD_NAMES_VALUE ); if ( NT_SUCCESS( GetRealmFlags( DomainName, &RealmFlags ) ) ) { printf( "\tRealm Flags = 0x%x", RealmFlags ); PrintRealmFlags( RealmFlags ); printf( "\n" ); } } Cleanup: if (KdcNames != NULL) { LocalFree(KdcNames); } if (AlternateRealmNames != NULL) { LocalFree(AlternateRealmNames); } return(Status); } NTSTATUS PrintNameMapping( VOID ) { DWORD RegErr; HKEY KerbHandle = NULL; HKEY UserListHandle = NULL; WCHAR ValueNameBuffer[500]; WCHAR ValueDataBuffer[500]; PWSTR ValueName; PWSTR ValueData; ULONG NameLength; ULONG DataLength; ULONG Index; ULONG Type; BOOL FoundAnyMappings = FALSE; CMULTISTRING StringClass; RegErr = OpenKerberosKey(&KerbHandle); if (RegErr) { goto Cleanup; } RegErr = RegOpenKeyEx( KerbHandle, L"UserList", 0, // no options KEY_QUERY_VALUE, &UserListHandle ); switch( RegErr ) { case ERROR_FILE_NOT_FOUND: goto NoMappingsWereFound; case ERROR_SUCCESS: break; // success condition. default: printf("Failed to create UserList key: 0x%x\n",RegErr); goto Cleanup; } for ( Index = 0; ; // forever Index++ ) { NameLength = sizeof(ValueNameBuffer); DataLength = sizeof(ValueDataBuffer); ValueName = ValueNameBuffer; ValueData = ValueDataBuffer; RtlZeroMemory( ValueName, NameLength ); RtlZeroMemory( ValueData, DataLength ); // 279626: this value should be in bytes NameLength /= sizeof( WCHAR ); RegErr = RegEnumValue( UserListHandle, Index, ValueName, &NameLength, NULL, &Type, (PBYTE) ValueData, &DataLength ); if ( RegErr == ERROR_SUCCESS ) { if ( _wcsicmp( ValueName , L"*" ) == 0 ) { ValueName = L"all users (*)"; } if (_wcsicmp(ValueData,L"*") == 0) { ValueData = L"a local account by the same name (*)"; } FoundAnyMappings = TRUE; printf( "Mapping %ws to %ws.\n", ValueName, ValueData ); } else { if ( RegErr != ERROR_NO_MORE_ITEMS ) { printf( "Registry error 0x%x while enumerating user mappings. Stopping here.\n", RegErr ); } break; } } if ( !FoundAnyMappings ) { NoMappingsWereFound: printf( "No user mappings defined.\n" ); } Cleanup: if (KerbHandle) { RegCloseKey(KerbHandle); } if (UserListHandle) { RegCloseKey(UserListHandle); } return(STATUS_SUCCESS); } NTSTATUS DumpState(LPWSTR * Parameters) { NTSTATUS Status; PPOLICY_DNS_DOMAIN_INFO DnsDomainInfo = NULL; Status = LsaQueryInformationPolicy( LsaHandle, PolicyDnsDomainInformation, (PVOID *) &DnsDomainInfo ); if (!NT_SUCCESS(Status)) { printf("Failed to query dns domain info: 0x%x\n",Status); goto Cleanup; } if ( DnsDomainInfo->DnsDomainName.Length == 0 ) { printf("Machine is not configured to log on to an external KDC. Probably a workgroup member\n"); /* goto Cleanup; 101055: Don't do this-- not having joined the domain doesn't preclude us from having KDC entries defined. */ } else { // nonempty dns domain, but no sid. Assume we're in an RFC1510 domain. printf( "default realm = %wZ ", &DnsDomainInfo->DnsDomainName ); if ( DnsDomainInfo->Sid != NULL ) { printf( "(NT Domain)\n" ); } else { printf( "(external)\n" ); } } PrintRealmList(); PrintNameMapping(); Cleanup: if (DnsDomainInfo != NULL) { LsaFreeMemory(DnsDomainInfo); } return(Status); }