windows-nt/Source/XPSP1/NT/net/ias/providers/ntuser/lsa/statinfo.c
2020-09-26 16:20:57 +08:00

254 lines
6 KiB
C

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// statinfo.c
//
// SYNOPSIS
//
// Defines and initializes global variables containing static configuration
// information.
//
// MODIFICATION HISTORY
//
// 08/15/1998 Original version.
// 03/24/1999 Convert domain names to upper case.
//
///////////////////////////////////////////////////////////////////////////////
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <ntlsa.h>
#include <windows.h>
#include <statinfo.h>
#include <iastrace.h>
//////////
// Domain names.
//////////
WCHAR theAccountDomain [DNLEN + 1]; // Local account domain.
WCHAR theRegistryDomain[DNLEN + 1]; // Registry override for default domain.
//////////
// SID's
//////////
PSID theAccountDomainSid;
PSID theBuiltinDomainSid;
//////////
// UNC name of the local computer.
//////////
WCHAR theLocalServer[CNLEN + 3];
//////////
// Product type for the local machine.
//////////
IAS_PRODUCT_TYPE ourProductType;
//////////
// Object Attributes -- no need to have more than one.
//////////
SECURITY_QUALITY_OF_SERVICE QOS =
{
sizeof(SECURITY_QUALITY_OF_SERVICE), // Length
SecurityImpersonation, // ImpersonationLevel
SECURITY_DYNAMIC_TRACKING, // ContextTrackingMode
FALSE // EffectiveOnly
};
OBJECT_ATTRIBUTES theObjectAttributes =
{
sizeof(OBJECT_ATTRIBUTES), // Length
NULL, // RootDirectory
NULL, // ObjectName
0, // Attributes
NULL, // SecurityDescriptor
&QOS // SecurityQualityOfService
};
//////////
// Buffers containing the SID's defined above.
//////////
BYTE theAccountDomainSidBuffer[24];
BYTE theBuiltinDomainSidBuffer[16];
//////////
// Location of default domain parameter in the registry.
//////////
CONST
WCHAR
RAS_KEYPATH_BUILTIN[] = L"SYSTEM\\CurrentControlSet\\Services\\RasMan"
L"\\ppp\\ControlProtocols\\BuiltIn";
CONST
WCHAR
RAS_VALUENAME_DEFAULT_DOMAIN[] = L"DefaultDomain";
///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION
//
// IASStaticInfoInitialize
//
// DESCRIPTION
//
// Initializes the static data defined above.
//
///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
IASStaticInfoInitialize( VOID )
{
DWORD cbData, status, type;
LSA_HANDLE hLsa;
PPOLICY_ACCOUNT_DOMAIN_INFO padi;
SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
NT_PRODUCT_TYPE ntProductType;
HKEY hKey;
//////////
// The local host is always the server for the local domain.
//////////
wcscpy(theLocalServer, L"\\\\");
cbData = CNLEN + 1;
if (!GetComputerNameW(theLocalServer + 2, &cbData))
{ return GetLastError(); }
IASTracePrintf("Local server: %S", theLocalServer);
//////////
// Open a handle to the LSA.
//////////
status = LsaOpenPolicy(
NULL,
&theObjectAttributes,
POLICY_VIEW_LOCAL_INFORMATION,
&hLsa
);
if (!NT_SUCCESS(status)) { goto error; }
//////////
// Get the account domain information.
//////////
status = LsaQueryInformationPolicy(
hLsa,
PolicyAccountDomainInformation,
(PVOID*)&padi
);
LsaClose(hLsa);
if (!NT_SUCCESS(status)) { goto error; }
// Save the domain name.
wcsncpy(theAccountDomain, padi->DomainName.Buffer, DNLEN);
_wcsupr(theAccountDomain);
IASTracePrintf("Local account domain: %S", theAccountDomain);
// Save the domain SID.
theAccountDomainSid = (PSID)theAccountDomainSidBuffer;
RtlCopySid(
sizeof(theAccountDomainSidBuffer),
theAccountDomainSid,
padi->DomainSid
);
// We have what we need, so free the memory.
LsaFreeMemory(padi);
//////////
// Form the SID for the Built-in domain.
//////////
theBuiltinDomainSid = (PSID)theBuiltinDomainSidBuffer;
RtlInitializeSid(
theBuiltinDomainSid,
&sia,
1
);
*RtlSubAuthoritySid(theBuiltinDomainSid, 0) = SECURITY_BUILTIN_DOMAIN_RID;
/////////
// Determine our product type.
//////////
RtlGetNtProductType(&ntProductType);
if (ntProductType == NtProductWinNt)
{
ourProductType = IAS_PRODUCT_WORKSTATION;
IASTraceString("Product Type: Workstation");
}
else
{
ourProductType = IAS_PRODUCT_SERVER;
IASTraceString("Product Type: Server");
}
//////////
// Read the default domain (if any) from the registry.
//////////
// Open the registry key.
status = RegOpenKeyW(
HKEY_LOCAL_MACHINE,
RAS_KEYPATH_BUILTIN,
&hKey
);
if (status == NO_ERROR)
{
// Query the default domain value.
cbData = sizeof(theRegistryDomain);
status = RegQueryValueExW(
hKey,
RAS_VALUENAME_DEFAULT_DOMAIN,
NULL,
&type,
(LPBYTE)theRegistryDomain,
&cbData
);
RegCloseKey(hKey);
}
// If we didn't successfully read a string, null it out.
if (status != NO_ERROR || type != REG_SZ)
{
theRegistryDomain[0] = L'\0';
}
_wcsupr(theRegistryDomain);
IASTracePrintf("Registry override: %S", theRegistryDomain);
// Ignore any registry errors since the override is optional.
return NO_ERROR;
error:
return RtlNtStatusToDosError(status);
}
///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION
//
// IASStaticInfoShutdown
//
// DESCRIPTION
//
// Currently just a placeholder.
//
///////////////////////////////////////////////////////////////////////////////
VOID
WINAPI
IASStaticInfoShutdown( VOID )
{
}