Add/update DNS Suffix (OS), Hostname (OS), fqdn [AMT] and DNS Suffix [AMT] info returned by --amtinfo.

This commit is contained in:
Mudit Vats
2020-12-17 11:08:13 -07:00
parent 3bfb88aeb6
commit d2633af0c5
11 changed files with 224 additions and 38 deletions

View File

@@ -126,23 +126,21 @@ add_dependencies(rpc MicroLMS )
target_link_libraries (rpc PRIVATE target_link_libraries (rpc PRIVATE
MicroLMS MicroLMS
iphlpapi
cpprestsdk::cpprest cpprestsdk::cpprest
cpprestsdk::cpprestsdk_zlib_internal cpprestsdk::cpprestsdk_zlib_internal
cpprestsdk::cpprestsdk_boost_internal cpprestsdk::cpprestsdk_boost_internal
cpprestsdk::cpprestsdk_brotli_internal cpprestsdk::cpprestsdk_brotli_internal
${Boost_LIBRARIES}
DbgHelp.lib DbgHelp.lib
Iphlpapi.lib Iphlpapi.lib
Setupapi.lib Setupapi.lib
ws2_32.lib ws2_32.lib
Psapi.lib Psapi.lib
Crypt32.lib Crypt32.lib
Wintrust.lib Wintrust.lib
Version.lib Version.lib
Wtsapi32.lib Wtsapi32.lib
Gdiplus.lib Gdiplus.lib
Userenv.lib Userenv.lib
) )
endif (UNIX) endif (UNIX)

View File

@@ -147,6 +147,10 @@ const PTHI_MESSAGE_HEADER SET_HOST_FQDN_HEADER = {
{AMT_MAJOR_VERSION, AMT_MAJOR_VERSION}, 0, {{SET_HOST_FQDN_REQUEST}}, 0 {AMT_MAJOR_VERSION, AMT_MAJOR_VERSION}, 0, {{SET_HOST_FQDN_REQUEST}}, 0
}; };
const PTHI_MESSAGE_HEADER GET_FQDN_HEADER = {
{AMT_MAJOR_VERSION, AMT_MAJOR_VERSION}, 0, {{GET_FQDN_REQUEST}}, 0
};
const PTHI_MESSAGE_HEADER GET_LOCAL_SYSTEM_ACCOUNT_HEADER = { const PTHI_MESSAGE_HEADER GET_LOCAL_SYSTEM_ACCOUNT_HEADER = {
{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_LOCAL_SYSTEM_ACCOUNT_REQUEST}}, 40 {AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_LOCAL_SYSTEM_ACCOUNT_REQUEST}}, 40
}; };
@@ -202,10 +206,10 @@ AMT_STATUS _call(const unsigned char *command, UINT32 command_size, UINT8 **read
{ {
return status; return status;
} }
if ((expSize != 0) && (expSize != outBuffSize)) //if ((expSize != 0) && (expSize != outBuffSize))
{ //{
return PTSDK_STATUS_INTERNAL_ERROR; //return PTSDK_STATUS_INTERNAL_ERROR;
} //}
return AMT_STATUS_SUCCESS; return AMT_STATUS_SUCCESS;
} }
@@ -1359,6 +1363,54 @@ AMT_STATUS pthi_SetHostFQDN(char* str)
return status; return status;
} }
/*
* Gets host FQDN in AMT Calls to CFG_SET_HOST_FQDN_REQUEST command
* Arguments:
* host - host FQDN
* Return values:
* AMT_STATUS_SUCCESS - on success
* PTSDK_STATUS_INTERNAL_ERROR - on failure
*/
AMT_STATUS pthi_GetHostFQDN(CFG_GET_FQDN_RESPONSE* fqdn)
{
AMT_STATUS status;
UINT8* readBuffer = NULL;
UINT32 command_size = sizeof(CFG_GET_HOST_FQDN_REQUEST);
CFG_GET_HOST_FQDN_REQUEST command;
CFG_GET_FQDN_RESPONSE* tmp_response;
memset(&command, 0, sizeof(CFG_GET_HOST_FQDN_REQUEST));
memcpy_s((UINT8*)&command, sizeof(command), (char*)&(GET_FQDN_HEADER), sizeof(GET_FQDN_HEADER));
status = _call((UINT8*)&command, command_size, &readBuffer, GET_FQDN_RESPONSE, sizeof(CFG_GET_FQDN_RESPONSE) - sizeof(char *));
// tes
if (status == AMT_STATUS_SUCCESS)
{
tmp_response = (CFG_GET_FQDN_RESPONSE*)readBuffer;
memcpy_s(&(fqdn->Header), sizeof(PTHI_MESSAGE_HEADER), (char*)&(tmp_response->Header), sizeof(PTHI_MESSAGE_HEADER));
fqdn->Status = tmp_response->Status;
fqdn->SharedFQDN = tmp_response->SharedFQDN;
fqdn->DDNSUpdateEnabled = tmp_response->DDNSUpdateEnabled;
fqdn->DDNSPeriodicUpdateInterval = tmp_response->DDNSPeriodicUpdateInterval;
fqdn->DDNSTTL = tmp_response->DDNSTTL;
fqdn->FQDN.Length = tmp_response->FQDN.Length;
fqdn->FQDN.Buffer = (CHAR*)malloc(fqdn->FQDN.Length * sizeof(CHAR));
if (NULL == fqdn->FQDN.Buffer) {
status = AMT_STATUS_INTERNAL_ERROR;
}
else {
memcpy_s(fqdn->FQDN.Buffer,
fqdn->FQDN.Length * sizeof(CHAR),
&(tmp_response->FQDN.Buffer),
tmp_response->FQDN.Length * sizeof(CHAR));
}
}
if (readBuffer != NULL) free(readBuffer);
return status;
}
/* /*

View File

@@ -509,6 +509,18 @@ typedef struct _AMT_PROV_AUDIT_RECORD
AMT_ANSI_STRING ProvServerFQDN; AMT_ANSI_STRING ProvServerFQDN;
} AMT_PROV_AUDIT_RECORD; } AMT_PROV_AUDIT_RECORD;
typedef struct
{
PTHI_MESSAGE_HEADER Header;
AMT_STATUS Status;
AMT_BOOLEAN SharedFQDN;
AMT_BOOLEAN DDNSUpdateEnabled;
UINT32 DDNSPeriodicUpdateInterval;
UINT32 DDNSTTL;
UINT32 HostNameLength;
AMT_ANSI_STRING FQDN;
} CFG_GET_FQDN_RESPONSE;
typedef struct _CFG_GENERATE_RNG_SEED_RESPONSE typedef struct _CFG_GENERATE_RNG_SEED_RESPONSE
{ {
PTHI_RESPONSE_MESSAGE_HEADER Header; PTHI_RESPONSE_MESSAGE_HEADER Header;
@@ -583,6 +595,11 @@ typedef struct CFG_SET_HOST_FQDN_REQUEST
char FQDN[256]; char FQDN[256];
}CFG_SET_HOST_FQDN_REQUEST; }CFG_SET_HOST_FQDN_REQUEST;
typedef struct CFG_GET_HOST_FQDN_REQUEST
{
PTHI_MESSAGE_HEADER Header;
} CFG_GET_HOST_FQDN_REQUEST;
typedef struct _CFG_SET_HOST_FQDN_RESPONSE typedef struct _CFG_SET_HOST_FQDN_RESPONSE
{ {
PTHI_MESSAGE_HEADER Header; PTHI_MESSAGE_HEADER Header;
@@ -678,6 +695,7 @@ AMT_STATUS pthi_EnumerateHashHandles(AMT_HASH_HANDLES *hashHandles);
AMT_STATUS pthi_GetCertificateHashEntry(UINT32 hashHandle, CERTHASH_ENTRY *hashEntry); AMT_STATUS pthi_GetCertificateHashEntry(UINT32 hashHandle, CERTHASH_ENTRY *hashEntry);
AMT_STATUS pthi_GetDnsSuffix(AMT_ANSI_STRING *dnsSuffix); AMT_STATUS pthi_GetDnsSuffix(AMT_ANSI_STRING *dnsSuffix);
AMT_STATUS pthi_SetHostFQDN(char* str); AMT_STATUS pthi_SetHostFQDN(char* str);
AMT_STATUS pthi_GetHostFQDN(CFG_GET_FQDN_RESPONSE* fqdn);
AMT_STATUS pthi_GetLocalSystemAccount(LOCAL_SYSTEM_ACCOUNT *localAccount); AMT_STATUS pthi_GetLocalSystemAccount(LOCAL_SYSTEM_ACCOUNT *localAccount);
AMT_STATUS pthi_Unprovision(CFG_PROVISIONING_MODE provisionMode); AMT_STATUS pthi_Unprovision(CFG_PROVISIONING_MODE provisionMode);
AMT_STATUS pthi_GetStateEHBC(AMT_EHBC_STATE *state); AMT_STATUS pthi_GetStateEHBC(AMT_EHBC_STATE *state);
@@ -790,6 +808,10 @@ const PTHI_MESSAGE_HEADER GET_FEATURES_STATE_HEADER;
#define SET_HOST_FQDN_RESPONSE 0x0480005b #define SET_HOST_FQDN_RESPONSE 0x0480005b
//const PTHI_MESSAGE_HEADER GET_PKI_FQDN_SUFFIX_HEADER; //const PTHI_MESSAGE_HEADER GET_PKI_FQDN_SUFFIX_HEADER;
#define GET_FQDN_REQUEST 0x4000056
#define GET_FQDN_RESPONSE 0x4800056
#define GET_LOCAL_SYSTEM_ACCOUNT_REQUEST 0x04000067 #define GET_LOCAL_SYSTEM_ACCOUNT_REQUEST 0x04000067
#define GET_LOCAL_SYSTEM_ACCOUNT_RESPONSE 0x04800067 #define GET_LOCAL_SYSTEM_ACCOUNT_RESPONSE 0x04800067
//const PTHI_MESSAGE_HEADER GET_LOCAL_SYSTEM_ACCOUNT_HEADER; //const PTHI_MESSAGE_HEADER GET_LOCAL_SYSTEM_ACCOUNT_HEADER;

View File

@@ -60,22 +60,8 @@ std::string get_dns_info()
if (!dnsSuffix.length()) if (!dnsSuffix.length())
{ {
std::vector<unsigned char> address; // get DNS from OS
cmd_get_wired_mac_address(address); dnsSuffix = net_get_dns();
if (address.size() == 6)
{
char macAddress[6];
macAddress[0] = address[0];
macAddress[1] = address[1];
macAddress[2] = address[2];
macAddress[3] = address[3];
macAddress[4] = address[4];
macAddress[5] = address[5];
// get DNS from OS
dnsSuffix = net_get_dns(macAddress);
}
} }
return dnsSuffix; return dnsSuffix;

View File

@@ -179,6 +179,36 @@ bool cmd_get_control_mode(int& mode)
return false; return false;
} }
bool cmd_get_fqdn(fqdn_settings& fqdn_settings)
{
fqdn_settings.fqdn.clear();
// initialize HECI interface
if (heci_Init(NULL, PTHI_CLIENT) == 0) return false;
// get fqdn
CFG_GET_FQDN_RESPONSE fqdn;
memset(&fqdn, 0, sizeof(CFG_GET_FQDN_RESPONSE));
AMT_STATUS amt_status = pthi_GetHostFQDN(&fqdn);
if (amt_status == 0)
{
fqdn_settings.ddns_ttl = fqdn.DDNSTTL;
fqdn_settings.ddns_update_enabled = fqdn.DDNSUpdateEnabled;
fqdn_settings.ddns_update_interval = fqdn.DDNSPeriodicUpdateInterval;
if (fqdn.FQDN.Length > 0)
{
fqdn_settings.fqdn = std::string(fqdn.FQDN.Buffer, fqdn.FQDN.Length);
}
return true;
}
return false;
}
bool cmd_get_dns_suffix(std::string& suffix) bool cmd_get_dns_suffix(std::string& suffix)
{ {
suffix.clear(); suffix.clear();

View File

@@ -28,6 +28,15 @@ struct lan_interface_settings
std::vector<unsigned char> mac_address; std::vector<unsigned char> mac_address;
}; };
struct fqdn_settings
{
bool shared_fqdn;
bool ddns_update_enabled;
int ddns_update_interval;
int ddns_ttl;
std::string fqdn;
};
bool cmd_is_admin(); bool cmd_is_admin();
bool cmd_get_version(std::string& version); bool cmd_get_version(std::string& version);
bool cmd_get_build_number(std::string& version); bool cmd_get_build_number(std::string& version);
@@ -35,6 +44,7 @@ bool cmd_get_sku(std::string& version);
bool cmd_get_uuid(std::vector<unsigned char>& uuid); bool cmd_get_uuid(std::vector<unsigned char>& uuid);
bool cmd_get_local_system_account(std::string& username, std::string& password); bool cmd_get_local_system_account(std::string& username, std::string& password);
bool cmd_get_control_mode(int& mode); bool cmd_get_control_mode(int& mode);
bool cmd_get_fqdn(fqdn_settings& fqdn_settings);
bool cmd_get_dns_suffix(std::string& suffix); bool cmd_get_dns_suffix(std::string& suffix);
bool cmd_get_wired_mac_address(std::vector<unsigned char>& address); bool cmd_get_wired_mac_address(std::vector<unsigned char>& address);
bool cmd_get_certificate_hashes(std::vector<cert_hash_entry>& hash_entries); bool cmd_get_certificate_hashes(std::vector<cert_hash_entry>& hash_entries);

View File

@@ -9,6 +9,7 @@
#include <iomanip> #include <iomanip>
#include "commands.h" #include "commands.h"
#include "utils.h" #include "utils.h"
#include "network.h"
const int PADDING = 25; const int PADDING = 25;
@@ -124,6 +125,29 @@ bool info_get_dns_suffix()
out_text("DNS Suffix", tmp); out_text("DNS Suffix", tmp);
tmp = net_get_dns();
out_text("DNS Suffix (OS)", tmp);
return true;
}
bool info_get_fqdn()
{
fqdn_settings fqdn;
if (cmd_get_fqdn(fqdn))
{
out_text("FQDN", fqdn.fqdn);
}
std::string tmp;
std::string dns;
tmp = net_get_hostname();
out_text("Hostname (OS)", tmp);
return true; return true;
} }
@@ -159,12 +183,13 @@ bool info_get_all()
bool status_uuid = info_get_uuid(); bool status_uuid = info_get_uuid();
bool status_mode = info_get_control_mode(); bool status_mode = info_get_control_mode();
bool status_dns = info_get_dns_suffix(); bool status_dns = info_get_dns_suffix();
bool status_fqdn = info_get_fqdn();
bool status_ras = info_get_remote_access_connection_status(); bool status_ras = info_get_remote_access_connection_status();
bool status_lan = info_get_lan_interface_settings(); bool status_lan = info_get_lan_interface_settings();
bool status_cert = info_get_certificate_hashes(); bool status_cert = info_get_certificate_hashes();
if (status_ver && status_bld && status_sku && status_uuid && status_mode && if (status_ver && status_bld && status_sku && status_uuid && status_mode &&
status_dns && status_ras && status_lan && status_cert) status_dns && status_fqdn && status_ras && status_lan && status_cert)
{ {
return true; return true;
} }
@@ -282,6 +307,10 @@ bool info_get(const std::string info)
{ {
return info_get_dns_suffix(); return info_get_dns_suffix();
} }
else if (info.compare("fqdn") == 0)
{
return info_get_fqdn();
}
else if (info.compare("cert") == 0) else if (info.compare("cert") == 0)
{ {
return info_get_certificate_hashes(); return info_get_certificate_hashes();
@@ -304,10 +333,10 @@ bool info_get(const std::string info)
bool info_get_verify(const std::string info) bool info_get_verify(const std::string info)
{ {
if ((info.compare("ver") == 0) || (info.compare("bld") == 0) || (info.compare("sku") == 0) || if ((info.compare("ver") == 0) || (info.compare("bld") == 0) || (info.compare("sku") == 0) ||
(info.compare("uuid") == 0) || (info.compare("mode") == 0) || (info.compare("dns") == 0) || (info.compare("uuid") == 0) || (info.compare("mode") == 0) || (info.compare("fqdn") == 0) ||
(info.compare("cert") == 0) || (info.compare("ras") == 0) || (info.compare("lan") == 0) || (info.compare("dns") == 0) || (info.compare("cert") == 0) || (info.compare("ras") == 0) ||
(info.compare("all") == 0)) (info.compare("lan") == 0) || (info.compare("all") == 0))
{ {
return true; return true;
} }

1
info.h
View File

@@ -16,6 +16,7 @@ bool info_get_sku();
bool info_get_uuid(); bool info_get_uuid();
bool info_get_control_mode(); bool info_get_control_mode();
bool info_get_dns_suffix(); bool info_get_dns_suffix();
bool info_get_fqdn();
bool info_get_all(); bool info_get_all();
bool info_get_remote_access_connection_status(); bool info_get_remote_access_connection_status();
bool info_get_lan_interface_settings(); bool info_get_lan_interface_settings();

View File

@@ -4,7 +4,9 @@
**********************************************************************/ **********************************************************************/
#include "network.h" #include "network.h"
#include "commands.h"
#include <iostream> #include <iostream>
#include <vector>
#ifdef _WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
@@ -181,5 +183,58 @@ std::string net_get_dns(char* macAddress)
return dnsSuffix; return dnsSuffix;
} }
#endif
#endif std::string net_get_hostname()
{
char hostname[256];
std::string hostname_string = "";
int result;
#ifdef WIN32
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
throw std::runtime_error("error: network error");
}
#endif
// get hostname
result = gethostname(hostname, sizeof(hostname));
#ifdef WIN32
WSACleanup();
#endif
if (result == 0)
{
hostname_string = hostname;
}
return hostname_string;
}
std::string net_get_dns()
{
std::string dns_suffix;
std::vector<unsigned char> address;
cmd_get_wired_mac_address(address);
if (address.size() == 6)
{
char macAddress[6];
macAddress[0] = address[0];
macAddress[1] = address[1];
macAddress[2] = address[2];
macAddress[3] = address[3];
macAddress[4] = address[4];
macAddress[5] = address[5];
// get DNS from OS
dns_suffix = net_get_dns(macAddress);
}
return dns_suffix;
}

View File

@@ -9,5 +9,7 @@
#include <string> #include <string>
std::string net_get_dns(char* macAddress); std::string net_get_dns(char* macAddress);
std::string net_get_hostname();
std::string net_get_dns();
#endif #endif

View File

@@ -40,6 +40,7 @@ void usage_show_help()
std::cout << " uuid unique identifier" << std::endl; std::cout << " uuid unique identifier" << std::endl;
std::cout << " mode current control mode" << std::endl; std::cout << " mode current control mode" << std::endl;
std::cout << " dns domain name suffix" << std::endl; std::cout << " dns domain name suffix" << std::endl;
std::cout << " fqdn fully qualified domain name" << std::endl;
std::cout << " cert certificate hashes" << std::endl; std::cout << " cert certificate hashes" << std::endl;
std::cout << " ras remote access status" << std::endl; std::cout << " ras remote access status" << std::endl;
std::cout << " lan LAN settings" << std::endl; std::cout << " lan LAN settings" << std::endl;