329 lines
8.3 KiB
C++
329 lines
8.3 KiB
C++
|
// Copyright (c) 1997-1999 Microsoft Corporation
|
||
|
//
|
||
|
// Computer naming tool
|
||
|
//
|
||
|
// 12-1-97 sburns
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef COMPUTER_HPP_INCLUDED
|
||
|
#define COMPUTER_HPP_INCLUDED
|
||
|
|
||
|
|
||
|
|
||
|
// An object representing the name, domain membership state, and other
|
||
|
// interesting properties of a machine.
|
||
|
|
||
|
class Computer
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
|
||
|
|
||
|
// Constructs a new instance. The new instance is not usable until the
|
||
|
// Refresh method is called.
|
||
|
//
|
||
|
// name - name of the computer. May have leading backslashes. May be
|
||
|
// an IP address, DNS, or NetBIOS computer name. empty means the local
|
||
|
// computer.
|
||
|
|
||
|
explicit
|
||
|
Computer(const String& name = String());
|
||
|
|
||
|
~Computer();
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the NetBIOS name of the computer.
|
||
|
|
||
|
String
|
||
|
GetNetbiosName() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the Fully-Qualified DNS name of the computer, taking into
|
||
|
// account the policy-imposed DNS suffix (if any). Returns the empty
|
||
|
// string if the computer does not have a DNS name (most likely because
|
||
|
// TCP/IP is not installed or properly configured on the machine).
|
||
|
|
||
|
String
|
||
|
GetFullDnsName() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the DNS name of the domain the computer is joined to, or the
|
||
|
// empty string if the computer is not joined to a DS domain.
|
||
|
|
||
|
String
|
||
|
GetDomainDnsName() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the NetBIOS name of the domain the computer is joined to, if
|
||
|
// the computer is joined to a domain, or the NetBIOS name of the
|
||
|
// workgroup the computer is joined to, if the computer is joined to a
|
||
|
// workgroup. See IsJoinedToDomain(), IsJoinedToWorkgroup().
|
||
|
|
||
|
String
|
||
|
GetDomainNetbiosName() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the name of the forest the machine is joined to, or the empty
|
||
|
// string if the machine is not joined to a DS domain.
|
||
|
//
|
||
|
// (The forest name is the dns domain name of the first domain in the
|
||
|
// forest.)
|
||
|
|
||
|
String
|
||
|
GetForestDnsName() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the major version number of the operating system the machine is
|
||
|
// running. For Windows NT 4, this is 4. For Windows 2000, this is 5.
|
||
|
|
||
|
DWORD
|
||
|
GetOsMajorVersion() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the minor version number of the operating system the machine is
|
||
|
// running.
|
||
|
|
||
|
DWORD
|
||
|
GetOsMinorVersion() const;
|
||
|
|
||
|
|
||
|
|
||
|
enum Role
|
||
|
{
|
||
|
STANDALONE_WORKSTATION = DsRole_RoleStandaloneWorkstation,
|
||
|
MEMBER_WORKSTATION = DsRole_RoleMemberWorkstation,
|
||
|
STANDALONE_SERVER = DsRole_RoleStandaloneServer,
|
||
|
MEMBER_SERVER = DsRole_RoleMemberServer,
|
||
|
PRIMARY_CONTROLLER = DsRole_RolePrimaryDomainController,
|
||
|
BACKUP_CONTROLLER = DsRole_RoleBackupDomainController
|
||
|
};
|
||
|
|
||
|
// Returns a value indicating the role of the computer. This value is
|
||
|
// always the "true" role of the computer, regardless of the safe boot
|
||
|
// mode of the computer.
|
||
|
|
||
|
Role
|
||
|
GetRole() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns true if the machine is a domain controller, false if not.
|
||
|
|
||
|
bool
|
||
|
IsDomainController() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns true if the instance refers to the local computer, false if
|
||
|
// it refers to another computer on the network. "Local Computer" means
|
||
|
// the computer on which this process is running.
|
||
|
|
||
|
bool
|
||
|
IsLocal() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns true if the machine is joined to any domain, false if not.
|
||
|
// (Note that IsJoinedToWorgroup == !IsJoinedToDomain, and vice-versa).
|
||
|
|
||
|
bool
|
||
|
IsJoinedToDomain() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns true if the machine is joined to the given DS domain, false if
|
||
|
// not -- the machine is joined to a non-DS domain, not joined to a domain,
|
||
|
// or joined to a DS domain of another name.
|
||
|
//
|
||
|
// domainDnsName - DNS name of the domain to test membership against.
|
||
|
|
||
|
bool
|
||
|
IsJoinedToDomain(const String& domainDnsName) const;
|
||
|
|
||
|
|
||
|
|
||
|
// Returns true if the machine is joined to any workgroup, false if not.
|
||
|
// (Note that IsJoinedToWorgroup == !IsJoinedToDomain, and vice-versa).
|
||
|
//
|
||
|
// If this function returns true, then the name returned by
|
||
|
// GetDomainNetbiosName is actually the name of the workgroup.
|
||
|
|
||
|
bool
|
||
|
IsJoinedToWorkgroup() const;
|
||
|
|
||
|
|
||
|
|
||
|
// Re-evaluates all computer info. Returns S_OK if all info was refreshed,
|
||
|
// or a standard error code if not. Typical errors include access denied
|
||
|
// and network path not found.
|
||
|
|
||
|
HRESULT
|
||
|
Refresh();
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// static functions
|
||
|
//
|
||
|
|
||
|
|
||
|
|
||
|
// Combines the hostname and suffix to form a fully-qualified DNS computer
|
||
|
// name, and returns that result. E.g. hostname.dns.domain.suffix.com
|
||
|
//
|
||
|
// hostname - the hostname component of the name. This string should not
|
||
|
// be empty.
|
||
|
//
|
||
|
// domainSuffix - the DNS domain suffix portion of the name. This portion
|
||
|
// may be empty, in which case the hostname is considered to be in the root
|
||
|
// domain ".". Or the suffix may be a single "." to indicate the root
|
||
|
// domain. Or the suffix may be a more typical sequence of labels
|
||
|
// separated by "."
|
||
|
|
||
|
static
|
||
|
String
|
||
|
ComposeFullDnsComputerName(
|
||
|
const String& hostname,
|
||
|
const String& domainSuffix);
|
||
|
|
||
|
|
||
|
|
||
|
// Retreives the netbios computer name that is currently in effect.
|
||
|
|
||
|
static
|
||
|
String
|
||
|
GetActivePhysicalNetbiosName();
|
||
|
|
||
|
|
||
|
|
||
|
// Retreives the fully-qualified DNS computer name that is currently in
|
||
|
// effect. May return the empty string if no DNS name exists (e.g. tcp/ip
|
||
|
// is not installed).
|
||
|
|
||
|
static
|
||
|
String
|
||
|
GetActivePhysicalFullDnsName();
|
||
|
|
||
|
|
||
|
|
||
|
// Retreives the netbios computer name that will take effect upon next
|
||
|
// reboot, or the current active name if no name change is pending.
|
||
|
|
||
|
static
|
||
|
String
|
||
|
GetFuturePhysicalNetbiosName();
|
||
|
|
||
|
|
||
|
// Retreives the fully-qualified DNS computer name that will be in effect
|
||
|
// when the computer is rebooted. If a future name is not set, then the
|
||
|
// result is the current active name (as that will still be the name in the
|
||
|
// future). Can return the empty string if the active name is not set
|
||
|
// either (e.g. tcp/ip is not installed)
|
||
|
|
||
|
static
|
||
|
String
|
||
|
GetFuturePhysicalFullDnsName();
|
||
|
|
||
|
|
||
|
// Determine the safeboot option that the machine is currently running
|
||
|
// under, or return 0 if the machine is running in normal boot mode.
|
||
|
// Returns S_OK on success, or an error code on failure.
|
||
|
//
|
||
|
// regHKLM - HKEY previously opened to the HKEY_LOCAL_MACHINE hive of a
|
||
|
// remote computer, or the special HKEY value of HKEY_LOCAL_MACHINE to
|
||
|
// evaluate the result for the local computer.
|
||
|
//
|
||
|
// result - the safeboot option. See sdk\inc\safeboot.h for the possible
|
||
|
// values.
|
||
|
|
||
|
static
|
||
|
HRESULT
|
||
|
GetSafebootOption(HKEY regHKLM, DWORD& result);
|
||
|
|
||
|
|
||
|
|
||
|
// Returns the product type like RtlGetNtProductType, except that the value
|
||
|
// is read directly from the registry. This is preferred to
|
||
|
// RtlGetNtProductType, because when booted in safe mode,
|
||
|
// RtlGetNtProductType is caused to lie such that a DC returns a result as
|
||
|
// though it were a normal server. Returns S_OK on success, or an error
|
||
|
// code on failure.
|
||
|
//
|
||
|
// regHKLM - HKEY previously opened to the HKEY_LOCAL_MACHINE hive of a
|
||
|
// remote computer, or the special HKEY value of HKEY_LOCAL_MACHINE to
|
||
|
// evaluate the result for the local computer.
|
||
|
//
|
||
|
// result - the product type code.
|
||
|
|
||
|
static
|
||
|
HRESULT
|
||
|
GetProductTypeFromRegistry(HKEY regHLKM, NT_PRODUCT_TYPE& result);
|
||
|
|
||
|
|
||
|
|
||
|
// Determine if the Dns suffix portion of the local computer name is forced
|
||
|
// to be a certain value by policy. If so, return true. If the
|
||
|
// determination cannot be made, or if the policy is not in effect, return
|
||
|
// false.
|
||
|
//
|
||
|
// policyDnsSuffix - out, if there is a policy in effect, this parameter
|
||
|
// will receive the suffix (which may be the empty string).
|
||
|
|
||
|
static
|
||
|
bool
|
||
|
IsDnsSuffixPolicyInEffect(String& policyDnsSuffix);
|
||
|
|
||
|
|
||
|
|
||
|
// Removes the leading backslashes from a UNC-style computer name, if
|
||
|
// present, and returns the result. For example, a name "\\mycomputer"
|
||
|
// would be returned as "mycomputer".
|
||
|
//
|
||
|
// computerName - the name from which leading backslashes are to be
|
||
|
// removed. If this name does not have leading backslashes, then this name
|
||
|
// is returned.
|
||
|
|
||
|
static
|
||
|
String
|
||
|
RemoveLeadingBackslashes(const String& computerName);
|
||
|
|
||
|
|
||
|
|
||
|
private:
|
||
|
|
||
|
|
||
|
|
||
|
// not implemented
|
||
|
|
||
|
Computer(const Computer& c);
|
||
|
const Computer& operator=(const Computer& c);
|
||
|
|
||
|
friend struct ComputerState;
|
||
|
|
||
|
String ctorName;
|
||
|
bool isRefreshed;
|
||
|
ComputerState* state;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#endif // COMPUTER_HPP_INCLUDED
|