|
|
/*--
Copyright (c) 1993 Microsoft Corporation
Module Name:
nlmon.h
Abstract:
Trusted Domain monitor program.
Author:
10-May-1993 (madana)
Environment:
User mode only. Contains NT-specific code. Requires ANSI C extensions: slash-slash comments, long external names.
Revision History:
--*/
#include <nt.h>
#include <ntlsa.h>
#include <ntsam.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windef.h>
#include <winbase.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <lmcons.h>
#include <lmerr.h>
#include <lmwksta.h>
#include <lmserver.h>
#include <lmaccess.h>
#include <lmapibuf.h>
#include <netlib.h>
#include <netlibnt.h>
#include <icanon.h>
#include <netlogon.h>
#include <netdebug.h>
#include <logonp.h>
#ifdef GLOBAL_DEF
#define EXTERN
#else
#define EXTERN extern
#endif
#ifdef DBG
#define NlMonDbgPrint(_x_) printf _x_
#else
#define NlMonDbgPrint(_x_)
#endif
#define DOMAIN_PARAM "/DOMAINLIST:"
#define MONTRUST_PARAM "/MONTRUST:"
#define UPDATE_PARAM "/UPDATE:"
#define DEBUG_PARAM "/DEBUG:"
#define YES_PARAM "YES"
#define NO_PARAM "NO"
#define DEBUG_MONITOR 0x00000001
#define DEBUG_INIT 0x00000002
#define DEBUG_UPDATE 0x00000004
#define DEBUG_TRUST 0x00000008
#define DEBUG_VERBOSE 0x80000000
#define IF_DEBUG(Function) if (GlobalTrace & DEBUG_ ## Function)
#define INIT_OBJ_ATTR(Obj) \
InitializeObjectAttributes( &(Obj), NULL, 0, NULL, NULL )
#define SERVERS_GROUP L"SERVERS"
#define DCSTATE_ONLINE L"DCOnline"
#define DCSTATE_OFFLINE L"DCOffLine"
#define TYPE_NTPDC L"NTPDC"
#define TYPE_NTBDC L"NTBDC"
#define TYPE_LMBDC L"LMBDC"
#define REPL_STATE_SYNC L"InSync"
#define REPL_STATE_REQ L"ReplRequired"
#define REPL_STATE_PROGRESS L"InProgress"
#define UNKNOWN L"Unknown"
#define CONST_GLOBALTRACE 0x00000000
#define CONST_GLOBALMONITORTRUST FALSE
#define CONST_GLOBALUPDATETIME 15
#define RETRY_COUNT 5
#define UNKNOWN_REPLICATION_STATE 0x80000000
//
// update flags.
//
#define UPDATE_DCS_FROM_SERVER_ENUM 0x00000001
#define UPDATE_DCS_FROM_DATABASE 0x00000002
#define UPDATE_TRUST_DOMAINS_FROM_DATABASE 0x00000004
#define UPDATE_TRUST_DCS_FROM_SERVER_ENUM 0x00000008
#define UPDATE_TRUST_DCS_FROM_DATABASE 0x00000010
#define VALIDATE_DCS 0x00000020
#define VALIDATE_TRUST_DCS 0x00000040
#define VALIDATE_TRUST_CONNECTIONS 0x00000080
#define STANDARD_UPDATE \
UPDATE_DCS_FROM_SERVER_ENUM | \ VALIDATE_DCS | \ UPDATE_TRUST_DCS_FROM_SERVER_ENUM | \ VALIDATE_TRUST_DCS \
#define UPDATE_FROM_DATABASE \
STANDARD_UPDATE | \ UPDATE_DCS_FROM_DATABASE | \ UPDATE_TRUST_DCS_FROM_DATABASE
#define UPDATE_TRUST_CONNECTIONS_STATUS \
STANDARD_UPDATE | \ VALIDATE_TRUST_CONNECTIONS
#define UPDATE_ALL \
STANDARD_UPDATE | \ UPDATE_FROM_DATABASE | \ UPDATE_TRUST_CONNECTIONS_STATUS | \ UPDATE_TRUST_DOMAINS_FROM_DATABASE
#define DOMAINLINE "............................................................................"
#define SESSLINE "****************************************************************************"
#define THREAD_STACKSIZE 1024 * 16 // 16K.
#define MACHINES_PER_PASS 250 // SAM machine acct. query size.
#define THREAD_WAIT_TIME 1 * 60 * 1000 // 1 min.
typedef enum _DC_STATE { DCOnLine, // DC currently on running.
DCOffLine // DC currently down.
} DC_STATE;
typedef enum _DC_TYPE { NTPDC, // NT Primary DC.
NTBDC, // NT Backup DC.
LMBDC, // Downlevel Backup DC.
} DC_TYPE;
typedef enum _DOMAIN_STATE { DomainSuccess, DomainProblem, DomainSick, DomainDown, DomainUnknown, } DOMAIN_STATE;
//
// generic entry
//
typedef struct _ENTRY { LIST_ENTRY NextEntry; UNICODE_STRING Name; } ENTRY, *PENTRY;
//
// DC entry.
//
typedef struct _DC_ENTRY { LIST_ENTRY NextEntry; // don't move this field
UNICODE_STRING DCName; // don't move this field
DC_STATE State; DC_TYPE Type; DWORD DCStatus; // DC Status
DWORD ReplicationStatus; // boolean flag bit array.
DWORD PDCLinkStatus; // To its PDC link status.
LIST_ENTRY TrustedDCs; BOOL TDCLinkState; // health of the trust connections.
DWORD RetryCount; BOOL DeleteFlag; } DC_ENTRY, *PDC_ENTRY;
//
// Trust Link entry.
//
typedef struct _TD_LINK { LIST_ENTRY NextEntry; // don't move this field
UNICODE_STRING TDName; // don't move this field
UNICODE_STRING DCName; DWORD SecureChannelStatus; BOOL DeleteFlag; } TD_LINK, *PTD_LINK;
typedef struct _DOMAIN_ENTRY { LIST_ENTRY NextEntry; // don't move this field
UNICODE_STRING Name; // don't move this field
LIST_ENTRY DCList; LIST_ENTRY TrustedDomainList; DOMAIN_STATE DomainState; LONG ReferenceCount; BOOL IsMonitoredDomain; DWORD UpdateFlags; HANDLE ThreadHandle; BOOL ThreadTerminateFlag; DWORD LastUpdateTime; } DOMAIN_ENTRY, *PDOMAIN_ENTRY;
typedef struct _DOMAIN_PRIVATE_ENTRY{ LIST_ENTRY NextEntry; // don't move this field
UNICODE_STRING Name; // don't move this field
PDOMAIN_ENTRY DomainEntry; BOOL DeleteFlag; } MONITORED_DOMAIN_ENTRY, *PMONITORED_DOMAIN_ENTRY, TRUSTED_DOMAIN_ENTRY, *PTRUSTED_DOMAIN_ENTRY;
//
// Global variables
//
EXTERN DWORD GlobalTrace;
EXTERN BOOL GlobalMonitorTrust; EXTERN DWORD GlobalUpdateTimeMSec; // UpdateTime in micro secs.
EXTERN LIST_ENTRY GlobalDomains; EXTERN LIST_ENTRY GlobalDomainsMonitored;
EXTERN CRITICAL_SECTION GlobalListCritSect; EXTERN CRITICAL_SECTION GlobalDomainUpdateThreadCritSect; EXTERN HANDLE GlobalWorkerThreadHandle; EXTERN HANDLE GlobalCmdProcessThreadHandle; EXTERN HANDLE GlobalTerminateEvent; EXTERN BOOL GlobalTerminateFlag;
EXTERN HANDLE GlobalUpdateEvent; EXTERN BOOL GlobalInitialized;
EXTERN HANDLE GlobalRefreshEvent; EXTERN HANDLE GlobalRefreshDoneEvent;
//
// This lock is a very simple lock. The list is updated (ie,
// add/delete/update an entry) after locking it using this lock.
// The reader of the list may lock the list if they don't want it
// updated while reading.
//
#define LOCK_LISTS() EnterCriticalSection( &GlobalListCritSect )
#define UNLOCK_LISTS() LeaveCriticalSection( &GlobalListCritSect )
//
// proto types.
//
VOID DomainUpdateThread( PDOMAIN_ENTRY DomainEntry );
BOOL StartDomainUpdateThread( PDOMAIN_ENTRY DomainEntry, DWORD UpdateFlags );
BOOL IsDomainUpdateThreadRunning( HANDLE *ThreadHandle );
VOID StopDomainUpdateThread( HANDLE *ThreadHandle, BOOL *ThreadTerminateFlag );
PMONITORED_DOMAIN_ENTRY AddToMonitoredDomainList( PUNICODE_STRING DomainName );
PTRUSTED_DOMAIN_ENTRY AddToTrustedDomainList( PLIST_ENTRY List, PUNICODE_STRING DomainName );
NTSTATUS QueryLsaInfo( PUNICODE_STRING ServerName, ACCESS_MASK DesiredAccess, POLICY_INFORMATION_CLASS InformationClass, PVOID *Info, PLSA_HANDLE ReturnHandle //optional
);
VOID CleanupLists( VOID );
DWORD InitGlobals( VOID );
VOID UpdateAndValidateDomain( PDOMAIN_ENTRY DomainEntry, DWORD UpdateFlags );
VOID UpdateAndValidateLists( DWORD UpdateFlags, BOOL ForceFlag );
VOID WorkerThread( VOID );
DWORD StartMonitor( LPWSTR DomainList, DWORD interval, BOOL MonitorTD );
DOMAIN_STATE QueryHealth( const LPWSTR DomainName );
VOID StopMonitor( VOID );
LPWSTR QueryPDC( const LPWSTR DomainName );
PLIST_ENTRY QueryTrustedDomain( const LPWSTR DomainName );
PLIST_ENTRY QueryDCList( const LPWSTR DomainName );
PLIST_ENTRY QueryTDLink( const LPWSTR DomainName, const LPWSTR DCName );
PLIST_ENTRY QueryTDCList( const LPWSTR DomainName, const LPWSTR TrustedDomainName);
DWORD DisConnect( const LPWSTR DomainName, const LPWSTR DCName, const LPWSTR TrustedDomainName );
VOID AddDomainToList( const LPWSTR DomainName );
VOID RemoveDomainFromList( const LPWSTR DomainName );
BOOL InitDomainListW( LPWSTR DomainList );
PLIST_ENTRY FindNamedEntry( PLIST_ENTRY List, PUNICODE_STRING Name );
VOID CleanupDomainEntry( PDOMAIN_ENTRY DomainEntry );
VOID UpdateDomainState( PDOMAIN_ENTRY DomainEntry );
NET_API_STATUS IsValidNTDC( PUNICODE_STRING ServerName, PUNICODE_STRING DomainName );
|