372 lines
9.8 KiB
C
372 lines
9.8 KiB
C
/*++
|
|
|
|
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.h> // NT definitions (temporary)
|
|
#include <ntrtl.h> // NT Rtl structure definitions (temporary)
|
|
#include <ntlsa.h>
|
|
|
|
#include <windef.h> // Win32 type definitions
|
|
|
|
#include <lmcons.h> // LAN Manager common definitions
|
|
#include <lmerr.h> // LAN Manager error code
|
|
#include <lmapibuf.h> // NetApiBufferAllocate()
|
|
#include <netdebug.h> // LPDEBUG_STRING typedef.
|
|
|
|
#include <config.h> // NetpConfig helpers.
|
|
#include <confname.h> // SECT_NT_ equates.
|
|
#include <debuglib.h> // IF_DEBUG().
|
|
#include <netlib.h> // My prototype.
|
|
|
|
#include <winerror.h> // 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 );
|
|
|
|
}
|
|
|