353 lines
9.3 KiB
C
353 lines
9.3 KiB
C
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
netname.h
|
|
|
|
Abstract:
|
|
|
|
defines for netname resource DLL
|
|
|
|
Author:
|
|
|
|
Charlie Wickham (charlwi) 21-Jan-2001
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <windns.h>
|
|
#include <dsgetdc.h>
|
|
|
|
//
|
|
// local defines
|
|
//
|
|
#define COUNT_OF( x ) ( sizeof( x ) / sizeof( x[0] ))
|
|
|
|
#define NetNameLogEvent ClusResLogEvent
|
|
|
|
//
|
|
// module externs
|
|
//
|
|
extern ULONG NetNameWorkerCheckPeriod;
|
|
extern LPWSTR NetNameCompObjAccountDesc;
|
|
|
|
//
|
|
// Resource Property constants
|
|
//
|
|
|
|
#define PARAM_NAME__NAME CLUSREG_NAME_NET_NAME
|
|
#define PARAM_NAME__FLAGS CLUSREG_NAME_FLAGS
|
|
|
|
#define PARAM_NAME__REMAP L"RemapPipeNames"
|
|
#define PARAM_DEFAULT__REMAP FALSE
|
|
|
|
#define PARAM_NAME__RANDOM L"Random"
|
|
#define PARAM_NAME__LASTNAME L"LastName"
|
|
#define PARAM_NAME__STATUS_NETBIOS L"StatusNetBIOS"
|
|
#define PARAM_NAME__STATUS_DNS L"StatusDNS"
|
|
#define PARAM_NAME__STATUS_KERBEROS L"StatusKerberos"
|
|
|
|
#define PARAM_NAME__REQUIRE_DNS L"RequireDNS"
|
|
#define PARAM_DEFAULT__REQUIRE_DNS 0
|
|
|
|
#define PARAM_NAME__REQUIRE_KERBEROS L"RequireKerberos"
|
|
#define PARAM_DEFAULT__REQUIRE_KERBEROS 0
|
|
|
|
#define PARAM_NAME__NEXT_UPDATE L"NextUpdate"
|
|
|
|
#define PARAM_NAME__UPDATE_INTERVAL L"UpdateInterval"
|
|
#define PARAM_DEFAULT__UPDATE_INTERVAL ( 60 * 24 * 7 ) // 1 week
|
|
#define PARAM_MINIMUM__UPDATE_INTERVAL ( 60 ) // 1 hour
|
|
#define PARAM_MAXIMUM__UPDATE_INTERVAL ( 60 * 24 * 7 * 365 ) // 1 year
|
|
|
|
//
|
|
// netname worker thread check frequencies for when talking to the DNS server
|
|
// goes as expected and when they don't. periods are in seconds. Short periods
|
|
// are for testing.
|
|
//
|
|
//#define _SHORT_PERIODS
|
|
|
|
#ifdef _SHORT_PERIODS
|
|
#define NETNAME_WORKER_NORMAL_CHECK_PERIOD 60
|
|
#define NETNAME_WORKER_PROBLEM_CHECK_PERIOD 60
|
|
#define NETNAME_WORKER_PENDING_PERIOD 2
|
|
#else
|
|
#define NETNAME_WORKER_NORMAL_CHECK_PERIOD (60 * 60 * 24) // 24 hours
|
|
#define NETNAME_WORKER_PROBLEM_CHECK_PERIOD (60 * 10) // 10 minutes
|
|
#define NETNAME_WORKER_PENDING_PERIOD 60
|
|
#endif
|
|
|
|
//
|
|
// this struct is used to hold the matched set of DNS A and PTR records with
|
|
// which the network name's DNS name and reverse name are registered.
|
|
// {Fwd,Rev}ZoneIsDynamic is used as a validity flag in the case where the
|
|
// initial DnsUpdateTest call timed out and we later discover that this server
|
|
// doesn't except updates. In that case, ZoneIsDynamic is set to FALSE and the
|
|
// worker thread checks for these records are skipped.
|
|
//
|
|
// In hind sight, each record type should have had its own DNS_LIST entry
|
|
// instead of putting both A and PTR together in one structure. This has led
|
|
// to constructing an invalid list of PTR records in its
|
|
// DNS_RRSET. Consequently, there is some ugly code in RegisterDnsRecords that
|
|
// has to build a fake DNS_RRSET in order to get the PTR records registered.
|
|
//
|
|
|
|
typedef struct _DNS_LISTS {
|
|
DNS_RRSET A_RRSet;
|
|
DNS_STATUS LastARecQueryStatus;
|
|
DNS_RRSET PTR_RRSet;
|
|
DNS_STATUS LastPTRRecQueryStatus; // not used
|
|
PIP4_ARRAY DnsServerList;
|
|
LPWSTR ConnectoidName;
|
|
|
|
//
|
|
// TRUE if we couldn't contact the server during record build time. This
|
|
// means that the worker thread will need to call DnsUpdateTest to
|
|
// determine if the server is dynamic
|
|
//
|
|
BOOL UpdateTestTimeout;
|
|
|
|
//
|
|
// used to "invalidate" this entry if we discovered after online that the
|
|
// server isn't dynamic
|
|
//
|
|
BOOL ForwardZoneIsDynamic;
|
|
|
|
//
|
|
// TRUE if we've already logged an error about this entry in the system
|
|
// event log
|
|
//
|
|
BOOL AErrorLogged;
|
|
|
|
//
|
|
// PTR corresponding vars with same functionality as their A counterparts
|
|
//
|
|
BOOL ReverseZoneIsDynamic;
|
|
BOOL PTRErrorLogged;
|
|
} DNS_LISTS, *PDNS_LISTS;
|
|
|
|
//
|
|
// set this define to one to get addt'l debug spew to see the interaction with
|
|
// the DNS server and determine if the RRSet structures are getting built
|
|
// correctly.
|
|
//
|
|
#define DBG_DNSLIST 0
|
|
|
|
//
|
|
// this struct is used to hold the mapping between a cluster IP address and a
|
|
// DNS domain name. The FQDN is built using these domain suffixes and the
|
|
// cluster netname. The connectoid name is included so we can log over which
|
|
// NIC we did the registration.
|
|
//
|
|
|
|
typedef struct _DOMAIN_ADDRESS_MAPPING {
|
|
LPWSTR ConnectoidName;
|
|
LPWSTR IpAddress;
|
|
LPWSTR DomainName;
|
|
PIP4_ARRAY DnsServerList;
|
|
} DOMAIN_ADDRESS_MAPPING, *PDOMAIN_ADDRESS_MAPPING;
|
|
|
|
//
|
|
// backing structure for resource properties
|
|
//
|
|
typedef struct _NETNAME_PARAMS {
|
|
//
|
|
// the name that is currently online
|
|
//
|
|
LPWSTR NetworkName;
|
|
|
|
//
|
|
// true if RemapPipeNames set to one; used by SQL to remap virtual pipe
|
|
// names to the node's name (?)
|
|
//
|
|
DWORD NetworkRemap;
|
|
|
|
//
|
|
// pointer to r/o encrypted computer object password
|
|
//
|
|
PBYTE NetworkRandom;
|
|
|
|
//
|
|
// R/W props: if set to TRUE, the respective section must succeed for the
|
|
// resource to go online. RequireKerberos implies RequireDNS.
|
|
//
|
|
BOOL RequireDNS;
|
|
BOOL RequireKerberos;
|
|
|
|
//
|
|
// read-only props that reflect final status codes for the corresponding
|
|
// functionality
|
|
//
|
|
DWORD StatusNetBIOS;
|
|
DWORD StatusDNS;
|
|
DWORD StatusKerberos;
|
|
|
|
//
|
|
// read-only timestamp of when to perform next password update
|
|
//
|
|
FILETIME NextUpdate;
|
|
|
|
//
|
|
// R/W pwd update interval in minutes
|
|
//
|
|
// ISSUE: units should be changed to hours and maybe even days
|
|
//
|
|
DWORD UpdateInterval;
|
|
} NETNAME_PARAMS, *PNETNAME_PARAMS;
|
|
|
|
//
|
|
// netname resource context block. One per instance of a netname resource.
|
|
//
|
|
typedef struct {
|
|
LIST_ENTRY Next;
|
|
LONG RefCount; // ref count on entire resource block
|
|
CLUSTER_RESOURCE_STATE State;
|
|
RESOURCE_HANDLE ResourceHandle; // handle to ourselves
|
|
DWORD dwFlags;
|
|
HANDLE * NameHandleList; // array of netbios w/s handles
|
|
DWORD NameHandleCount;
|
|
CLUS_WORKER PendingThread;
|
|
LPWSTR NodeName;
|
|
LPWSTR NodeId;
|
|
|
|
//
|
|
// handles to our resource key, resource parameters key and node
|
|
// parameters keys as well as the resource itself
|
|
//
|
|
HKEY ResKey;
|
|
HKEY ParametersKey;
|
|
HKEY NodeParametersKey;
|
|
HRESOURCE ClusterResourceHandle;
|
|
|
|
//
|
|
// used during online pending processing so we can keep increasing the
|
|
// checkpoint value for each individual resource
|
|
//
|
|
ULONG StatusCheckpoint;
|
|
|
|
//
|
|
// count and pointer to the DNS publishing information; mutex is used to
|
|
// sync access to DnsLists and NumberOfDnsLists
|
|
//
|
|
HANDLE DnsListMutex;
|
|
DWORD NumberOfDnsLists;
|
|
PDNS_LISTS DnsLists;
|
|
|
|
//
|
|
// holder of resource properties
|
|
//
|
|
NETNAME_PARAMS Params;
|
|
|
|
//
|
|
// used to handle case where the name property has changed while the
|
|
// resource is online. If TRUE, then offline processing will take
|
|
// appropriate steps to handle this condition.
|
|
//
|
|
BOOL NameChangedWhileOnline;
|
|
|
|
//
|
|
// number of bytes pointed to by Params.NetworkRandom
|
|
//
|
|
DWORD RandomSize;
|
|
|
|
//
|
|
// objectGUID attribute of the computer object from DS. Using the GUID
|
|
// frees us from having to track object moves in the DS.
|
|
//
|
|
LPWSTR ObjectGUID;
|
|
|
|
//
|
|
// DoKerberosCheck is TRUE if AddComputerObject was successful. This is
|
|
// used by the worker thread to check on the computer object. The status
|
|
// returned by that check is stored in KerberosStatus.
|
|
//
|
|
BOOL DoKerberosCheck;
|
|
DWORD KerberosStatus;
|
|
|
|
//
|
|
// used to track if we should delete the computer account at the DS when
|
|
// the resource goes offline. This happens when RequireKerberos is changed
|
|
// from one to zero. If we don't do this, client's will not fallback to
|
|
// NTLM authentication when negotiating a security context.
|
|
//
|
|
BOOL DeleteCOWhenOffline;
|
|
} NETNAME_RESOURCE, *PNETNAME_RESOURCE;
|
|
|
|
//
|
|
// public routines
|
|
//
|
|
DWORD
|
|
GrowBlock(
|
|
PCHAR * Block,
|
|
DWORD UsedEntries,
|
|
DWORD BlockSize,
|
|
PDWORD FreeEntries
|
|
);
|
|
|
|
DWORD
|
|
NetNameCheckNbtName(
|
|
IN LPCWSTR NetName,
|
|
IN DWORD NameHandleCount,
|
|
IN HANDLE * NameHandleList,
|
|
IN RESOURCE_HANDLE ResourceHandle
|
|
);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
DWORD
|
|
NetNameAddComputerObject(
|
|
IN PCLUS_WORKER Worker,
|
|
IN PNETNAME_RESOURCE Resource,
|
|
OUT PWCHAR * MachinePwd
|
|
);
|
|
|
|
DWORD
|
|
NetNameDeleteComputerObject(
|
|
IN PNETNAME_RESOURCE Resource
|
|
);
|
|
|
|
HRESULT
|
|
CheckComputerObjectAttributes(
|
|
IN PNETNAME_RESOURCE Resource
|
|
);
|
|
|
|
DWORD
|
|
IsComputerObjectInDS(
|
|
IN LPWSTR NodeName,
|
|
IN LPWSTR NewObjectName,
|
|
OUT PBOOL ObjectExists
|
|
);
|
|
|
|
HRESULT
|
|
GetComputerObjectGuid(
|
|
IN PNETNAME_RESOURCE Resource
|
|
);
|
|
|
|
HRESULT
|
|
RenameComputerObject(
|
|
IN PNETNAME_RESOURCE Resource,
|
|
IN LPWSTR NewName OPTIONAL
|
|
);
|
|
|
|
DWORD
|
|
UpdateCompObjPassword(
|
|
IN PNETNAME_RESOURCE Resource
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/* end netname.h */
|
|
|