/*++ Copyright (c) 1992 Microsoft Corporation Module Name: DomName.c Abstract: This file contains NetpGetDomainName(). Author: John Rogers (JohnRo) 09-Jan-1992 Environment: User Mode - Win32 Portable to any flat, 32-bit environment. (Uses Win32 typedefs.) Requires ANSI C extensions: slash-slash comments, long external names. Revision History: 09-Jan-1992 JohnRo Created. 13-Feb-1992 JohnRo Moved section name equates to ConfName.h. 13-Mar-1992 JohnRo Get rid of old config helper callers. --*/ #include // NT definitions (temporary) #include // NT Rtl structure definitions (temporary) #include #include // Win32 type definitions #include // LAN Manager common definitions #include // LAN Manager error code #include // NetApiBufferAllocate() #include // LPDEBUG_STRING typedef. #include // NetpConfig helpers. #include // SECT_NT_ equates. #include // IF_DEBUG(). #include // My prototype. #include // ERROR_ equates, NO_ERROR. NET_API_STATUS NetpGetDomainNameExExEx ( OUT LPTSTR *DomainNamePtr, OUT LPTSTR *DnsDomainNamePtr OPTIONAL, OUT LPTSTR *DnsForestNamePtr OPTIONAL, OUT GUID **DomainGuidPtr OPTIONAL, OUT PBOOLEAN IsWorkgroupName ) /*++ Routine Description: Returns the name of the domain or workgroup this machine belongs to. Arguments: DomainNamePtr - The name of the domain or workgroup Free the returned buffer user NetApiBufferFree. DnsDomainNamePtr - Returns the DNS name of the domain this machine is a member of. NULL is returned if the machine is not a member of a domain or if that domain has no DNS name. Free the returned buffer user NetApiBufferFree. DnsForestNamePtr - Returns the DNS forest name of the forest this machine is in. NULL is returned if the machine is not a member of a domain or if that domain has no DNS name. Free the returned buffer user NetApiBufferFree. DomainGuidPtr - Returns the domain GUID of the domain this machine is a member of. NULL is return if the machine is not a member of a domain or if that domain has no domain GUID. Free the returned buffer user NetApiBufferFree. IsWorkgroupName - Returns TRUE if the name is a workgroup name. Returns FALSE if the name is a domain name. Return Value: NERR_Success - Success. NERR_CfgCompNotFound - There was an error determining the domain name --*/ { NET_API_STATUS NetStatus; NTSTATUS Status; LSA_HANDLE PolicyHandle = NULL; PPOLICY_DNS_DOMAIN_INFO PrimaryDomainInfo = NULL; OBJECT_ATTRIBUTES ObjAttributes; // // Check for caller's errors. // if (DomainNamePtr == NULL) { return ERROR_INVALID_PARAMETER; } *DomainNamePtr = NULL; if ( ARGUMENT_PRESENT(DnsDomainNamePtr)) { *DnsDomainNamePtr = NULL; } if ( ARGUMENT_PRESENT(DnsForestNamePtr)) { *DnsForestNamePtr = NULL; } if ( ARGUMENT_PRESENT(DomainGuidPtr)) { *DomainGuidPtr = NULL; } // // Open a handle to the local security policy. Initialize the // objects attributes structure first. // InitializeObjectAttributes( &ObjAttributes, NULL, 0L, NULL, NULL ); Status = LsaOpenPolicy( NULL, &ObjAttributes, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle ); if (! NT_SUCCESS(Status)) { NetpKdPrint(("NetpGetDomainName: LsaOpenPolicy returned " FORMAT_NTSTATUS "\n", Status)); NetStatus = NERR_CfgCompNotFound; goto Cleanup; } // // Get the name of the primary domain from LSA // Status = LsaQueryInformationPolicy( PolicyHandle, PolicyDnsDomainInformation, (PVOID *) &PrimaryDomainInfo ); if (! NT_SUCCESS(Status)) { NetpKdPrint(("NetpGetDomainName: LsaQueryInformationPolicy failed " FORMAT_NTSTATUS "\n", Status)); NetStatus = NERR_CfgCompNotFound; goto Cleanup; } // // Copy the Netbios domain name. // if ((NetStatus = NetApiBufferAllocate( PrimaryDomainInfo->Name.Length + sizeof(WCHAR), DomainNamePtr )) != NERR_Success) { goto Cleanup; } memcpy( *DomainNamePtr, PrimaryDomainInfo->Name.Buffer, PrimaryDomainInfo->Name.Length ); (*DomainNamePtr)[PrimaryDomainInfo->Name.Length/sizeof(WCHAR)] = L'\0'; // // Copy the DNS domain name. // if ( ARGUMENT_PRESENT(DnsDomainNamePtr) && PrimaryDomainInfo->DnsDomainName.Length != 0 ) { if ((NetStatus = NetApiBufferAllocate( PrimaryDomainInfo->DnsDomainName.Length + sizeof(WCHAR), DnsDomainNamePtr )) != NERR_Success) { goto Cleanup; } memcpy( *DnsDomainNamePtr, PrimaryDomainInfo->DnsDomainName.Buffer, PrimaryDomainInfo->DnsDomainName.Length ); (*DnsDomainNamePtr)[PrimaryDomainInfo->DnsDomainName.Length/sizeof(WCHAR)] = L'\0'; } // // Copy the DNS forest name. // if ( ARGUMENT_PRESENT(DnsForestNamePtr) && PrimaryDomainInfo->DnsForestName.Length != 0 ) { if ((NetStatus = NetApiBufferAllocate( PrimaryDomainInfo->DnsForestName.Length + sizeof(WCHAR), DnsForestNamePtr )) != NERR_Success) { goto Cleanup; } memcpy( *DnsForestNamePtr, PrimaryDomainInfo->DnsForestName.Buffer, PrimaryDomainInfo->DnsForestName.Length ); (*DnsForestNamePtr)[PrimaryDomainInfo->DnsForestName.Length/sizeof(WCHAR)] = L'\0'; } // // Copy the domain GUID. // if ( ARGUMENT_PRESENT(DomainGuidPtr) && RtlCompareMemoryUlong( &PrimaryDomainInfo->DomainGuid, sizeof(GUID), 0 ) != sizeof(GUID) ) { if ((NetStatus = NetApiBufferAllocate( sizeof(GUID), DomainGuidPtr )) != NERR_Success) { goto Cleanup; } memcpy( *DomainGuidPtr, &PrimaryDomainInfo->DomainGuid, sizeof(GUID)); } *IsWorkgroupName = (PrimaryDomainInfo->Sid == NULL); IF_DEBUG(CONFIG) { NetpKdPrint(("NetpGetDomainName got " FORMAT_LPTSTR "\n", *DomainNamePtr)); } NetStatus = NO_ERROR; Cleanup: if ( NetStatus != NO_ERROR ) { if ( *DomainNamePtr != NULL ) { NetApiBufferFree( *DomainNamePtr ); *DomainNamePtr = NULL; } if ( ARGUMENT_PRESENT(DnsDomainNamePtr)) { if ( *DnsDomainNamePtr != NULL ) { NetApiBufferFree( *DnsDomainNamePtr ); *DnsDomainNamePtr = NULL; } } if ( ARGUMENT_PRESENT(DnsForestNamePtr)) { if ( *DnsForestNamePtr != NULL ) { NetApiBufferFree( *DnsForestNamePtr ); *DnsForestNamePtr = NULL; } } if ( ARGUMENT_PRESENT(DomainGuidPtr)) { if ( *DomainGuidPtr != NULL ) { NetApiBufferFree( *DomainGuidPtr ); *DomainGuidPtr = NULL; } } } if ( PrimaryDomainInfo != NULL ) { (void) LsaFreeMemory((PVOID) PrimaryDomainInfo); } if ( PolicyHandle != NULL ) { (void) LsaClose(PolicyHandle); } return NetStatus; } NET_API_STATUS NetpGetDomainNameExEx ( OUT LPTSTR *DomainNamePtr, OUT LPTSTR *DnsDomainNamePtr OPTIONAL, OUT PBOOLEAN IsWorkgroupName ) /*++ Routine Description: Returns the name of the domain or workgroup this machine belongs to. Arguments: DomainNamePtr - The name of the domain or workgroup Free the returned buffer user NetApiBufferFree. DnsDomainNamePtr - Returns the DNS name of the domain this machine is is member of. NULL is returned if the machine is not a member of a domain or for that domain has no DNS name. Free the returned buffer user NetApiBufferFree. IsWorkgroupName - Returns TRUE if the name is a workgroup name. Returns FALSE if the name is a domain name. Return Value: NERR_Success - Success. NERR_CfgCompNotFound - There was an error determining the domain name --*/ { return NetpGetDomainNameExExEx( DomainNamePtr, DnsDomainNamePtr, NULL, NULL, IsWorkgroupName ); } NET_API_STATUS NetpGetDomainNameEx ( OUT LPTSTR *DomainNamePtr, // alloc and set ptr (free with NetApiBufferFree) OUT PBOOLEAN IsWorkgroupName ) /*++ Routine Description: Returns the name of the domain or workgroup this machine belongs to. Arguments: DomainNamePtr - The name of the domain or workgroup IsWorkgroupName - Returns TRUE if the name is a workgroup name. Returns FALSE if the name is a domain name. Return Value: NERR_Success - Success. NERR_CfgCompNotFound - There was an error determining the domain name --*/ { return NetpGetDomainNameExExEx( DomainNamePtr, NULL, NULL, NULL, IsWorkgroupName ); } NET_API_STATUS NetpGetDomainName ( IN LPTSTR *DomainNamePtr // alloc and set ptr (free with NetApiBufferFree) ) { BOOLEAN IsWorkgroupName; return NetpGetDomainNameExExEx( DomainNamePtr, NULL, NULL, NULL, &IsWorkgroupName ); }