1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // WMI (Windows Management and Instrumentation) is a big, complex, COM-based 6*6777b538SAndroid Build Coastguard Worker // API that can be used to perform all sorts of things. Sometimes is the best 7*6777b538SAndroid Build Coastguard Worker // way to accomplish something under windows but its lack of an approachable 8*6777b538SAndroid Build Coastguard Worker // C++ interface prevents its use. This collection of functions is a step in 9*6777b538SAndroid Build Coastguard Worker // that direction. 10*6777b538SAndroid Build Coastguard Worker // There are two classes; WMIUtil and WMIProcessUtil. The first 11*6777b538SAndroid Build Coastguard Worker // one contains generic helpers and the second one contains the only 12*6777b538SAndroid Build Coastguard Worker // functionality that is needed right now which is to use WMI to launch a 13*6777b538SAndroid Build Coastguard Worker // process. 14*6777b538SAndroid Build Coastguard Worker // To use any function on this header you must call CoInitialize or 15*6777b538SAndroid Build Coastguard Worker // CoInitializeEx beforehand. 16*6777b538SAndroid Build Coastguard Worker // 17*6777b538SAndroid Build Coastguard Worker // For more information about WMI programming: 18*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/win32/wmisdk 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_WMI_H_ 21*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_WMI_H_ 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker #include <wbemidl.h> 24*6777b538SAndroid Build Coastguard Worker #include <wrl/client.h> 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker #include <optional> 27*6777b538SAndroid Build Coastguard Worker #include <string> 28*6777b538SAndroid Build Coastguard Worker #include <string_view> 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker namespace base { 33*6777b538SAndroid Build Coastguard Worker namespace win { 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Enumeration of errors that can arise when connecting to a WMI server and 36*6777b538SAndroid Build Coastguard Worker // running a query. 37*6777b538SAndroid Build Coastguard Worker // Do not change ordering. This enum is captured as `WmiQueryError` in 38*6777b538SAndroid Build Coastguard Worker // enums.xml. 39*6777b538SAndroid Build Coastguard Worker enum class WmiError { 40*6777b538SAndroid Build Coastguard Worker kFailedToCreateInstance = 0, 41*6777b538SAndroid Build Coastguard Worker kFailedToConnectToWMI = 1, 42*6777b538SAndroid Build Coastguard Worker kFailedToSetSecurityBlanket = 2, 43*6777b538SAndroid Build Coastguard Worker kFailedToExecWMIQuery = 3, 44*6777b538SAndroid Build Coastguard Worker kMaxValue = kFailedToExecWMIQuery 45*6777b538SAndroid Build Coastguard Worker }; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker // String used to connect to the CIMV2 WMI server. 48*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const wchar_t kCimV2ServerName[]; 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // String used to connect to the SecurityCenter2 WMI server. 51*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const wchar_t kSecurityCenter2ServerName[]; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Connects to a server named `server_name` on the local computer through COM 54*6777b538SAndroid Build Coastguard Worker // and run the given WQL `query`. Sets `enumerator` with the values returned by 55*6777b538SAndroid Build Coastguard Worker // that `query`. Will return a WmiError value if an error occurs, else returns 56*6777b538SAndroid Build Coastguard Worker // std::nullopt. 57*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::optional<WmiError> RunWmiQuery( 58*6777b538SAndroid Build Coastguard Worker const std::wstring& server_name, 59*6777b538SAndroid Build Coastguard Worker const std::wstring& query, 60*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IEnumWbemClassObject>* enumerator); 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Creates an instance of the WMI service connected to the local computer and 63*6777b538SAndroid Build Coastguard Worker // returns its COM interface. If |set_blanket| is set to true, the basic COM 64*6777b538SAndroid Build Coastguard Worker // security blanket is applied to the returned interface. This is almost 65*6777b538SAndroid Build Coastguard Worker // always desirable unless you set the parameter to false and apply a custom 66*6777b538SAndroid Build Coastguard Worker // COM security blanket. 67*6777b538SAndroid Build Coastguard Worker // Returns true if succeeded and |wmi_services|: the pointer to the service. 68*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool CreateLocalWmiConnection( 69*6777b538SAndroid Build Coastguard Worker bool set_blanket, 70*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IWbemServices>* wmi_services); 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker // Creates an instance of the WMI service connected to the resource and 73*6777b538SAndroid Build Coastguard Worker // returns its COM interface. If |set_blanket| is set to true, the basic COM 74*6777b538SAndroid Build Coastguard Worker // security blanket is applied to the returned interface. This is almost 75*6777b538SAndroid Build Coastguard Worker // always desirable unless you set the parameter to false and apply a custom 76*6777b538SAndroid Build Coastguard Worker // COM security blanket. 77*6777b538SAndroid Build Coastguard Worker // Returns a valid ComPtr<IWbemServices> on success, nullptr on failure. 78*6777b538SAndroid Build Coastguard Worker BASE_EXPORT Microsoft::WRL::ComPtr<IWbemServices> CreateWmiConnection( 79*6777b538SAndroid Build Coastguard Worker bool set_blanket, 80*6777b538SAndroid Build Coastguard Worker const std::wstring& resource); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker // Creates a WMI method using from a WMI class named |class_name| that 83*6777b538SAndroid Build Coastguard Worker // contains a method named |method_name|. Only WMI classes that are CIM 84*6777b538SAndroid Build Coastguard Worker // classes can be created using this function. 85*6777b538SAndroid Build Coastguard Worker // Returns true if succeeded and |class_instance| returns a pointer to the 86*6777b538SAndroid Build Coastguard Worker // WMI method that you can fill with parameter values using SetParameter. 87*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool CreateWmiClassMethodObject( 88*6777b538SAndroid Build Coastguard Worker IWbemServices* wmi_services, 89*6777b538SAndroid Build Coastguard Worker std::wstring_view class_name, 90*6777b538SAndroid Build Coastguard Worker std::wstring_view method_name, 91*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IWbemClassObject>* class_instance); 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker // Creates a new process from |command_line|. The advantage over CreateProcess 94*6777b538SAndroid Build Coastguard Worker // is that it allows you to always break out from a Job object that the caller 95*6777b538SAndroid Build Coastguard Worker // is attached to even if the Job object flags prevent that. 96*6777b538SAndroid Build Coastguard Worker // Returns true and the process id in process_id if the process is launched 97*6777b538SAndroid Build Coastguard Worker // successful. False otherwise. 98*6777b538SAndroid Build Coastguard Worker // Note that a fully qualified path must be specified in most cases unless 99*6777b538SAndroid Build Coastguard Worker // the program is not in the search path of winmgmt.exe. 100*6777b538SAndroid Build Coastguard Worker // Processes created this way are children of wmiprvse.exe and run with the 101*6777b538SAndroid Build Coastguard Worker // caller credentials. 102*6777b538SAndroid Build Coastguard Worker // More info: http://msdn2.microsoft.com/en-us/library/aa394372(VS.85).aspx 103*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool WmiLaunchProcess(const std::wstring& command_line, 104*6777b538SAndroid Build Coastguard Worker int* process_id); 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker // An encapsulation of information retrieved from the 'Win32_ComputerSystem' and 107*6777b538SAndroid Build Coastguard Worker // 'Win32_Bios' WMI classes; see : 108*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-computersystem 109*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-systembios 110*6777b538SAndroid Build Coastguard Worker // Note that while model and manufacturer can be obtained through WMI, it is 111*6777b538SAndroid Build Coastguard Worker // more efficient to obtain them via SysInfo::GetHardwareInfo() which uses the 112*6777b538SAndroid Build Coastguard Worker // registry. 113*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT WmiComputerSystemInfo { 114*6777b538SAndroid Build Coastguard Worker public: 115*6777b538SAndroid Build Coastguard Worker static WmiComputerSystemInfo Get(); 116*6777b538SAndroid Build Coastguard Worker serial_number()117*6777b538SAndroid Build Coastguard Worker const std::wstring& serial_number() const { return serial_number_; } 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker private: 120*6777b538SAndroid Build Coastguard Worker void PopulateSerialNumber( 121*6777b538SAndroid Build Coastguard Worker const Microsoft::WRL::ComPtr<IEnumWbemClassObject>& enumerator_bios); 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker std::wstring serial_number_; 124*6777b538SAndroid Build Coastguard Worker }; 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker } // namespace win 127*6777b538SAndroid Build Coastguard Worker } // namespace base 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_WMI_H_ 130