// 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