15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WMI (Windows Management and Instrumentation) is a big, complex, COM-based 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API that can be used to perform all sorts of things. Sometimes is the best 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// way to accomplish something under windows but its lack of an approachable 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ interface prevents its use. This collection of fucntions is a step in 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that direction. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are two classes; WMIUtil and WMIProcessUtil. The first 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one contain generic helpers and the second one contains the only 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functionality that is needed right now which is to use WMI to launch a 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To use any function on this header you must call CoInitialize or 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CoInitializeEx beforehand. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For more information about WMI programming: 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://msdn2.microsoft.com/en-us/library/aa384642(VS.85).aspx 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_INSTALLER_UTIL_WMI_H_ 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_INSTALLER_UTIL_WMI_H_ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <wbemidl.h> 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace installer { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WMI { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates an instance of the WMI service connected to the local computer and 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns its COM interface. If 'set-blanket' is set to true, the basic COM 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // security blanket is applied to the returned interface. This is almost 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // always desirable unless you set the parameter to false and apply a custom 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // COM security blanket. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if succeeded and 'wmi_services': the pointer to the service. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When done with the interface you must call Release(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool CreateLocalConnection(bool set_blanket, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IWbemServices** wmi_services); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a WMI method using from a WMI class named 'class_name' that 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contains a method named 'method_name'. Only WMI classes that are CIM 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // classes can be created using this function. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if succeeded and 'class_instance' returns a pointer to the 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WMI method that you can fill with parameter values using SetParameter. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When done with the interface you must call Release(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool CreateClassMethodObject(IWbemServices* wmi_services, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& class_name, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& method_name, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IWbemClassObject** class_instance); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills a single parameter given an instanced 'class_method'. Returns true 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if operation succeeded. When all the parameters are set the method can 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be executed using IWbemServices::ExecMethod(). 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetParameter(IWbemClassObject* class_method, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::wstring& parameter_name, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* parameter); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class contains functionality of the WMI class 'Win32_Process' 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// more info: http://msdn2.microsoft.com/en-us/library/aa394372(VS.85).aspx 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WMIProcess { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a new process from 'command_line'. The advantage over CreateProcess 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is that it allows you to always break out from a Job object that the caller 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is attached to even if the Job object flags prevent that. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true and the process id in process_id if the process is launched 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // successful. False otherwise. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that a fully qualified path must be specified in most cases unless 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the program is not in the search path of winmgmt.exe. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes created this way are children of wmiprvse.exe and run with the 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // caller credentials. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Launch(const std::wstring& command_line, int* process_id); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class contains functionality of the WMI class 'Win32_ComputerSystem' 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// more info: http://msdn.microsoft.com/en-us/library/aa394102(VS.85).aspx 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WMIComputerSystem { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a human readable string for the model/make of this computer. 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static base::string16 GetModel(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace installer 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_INSTALLER_UTIL_WMI_H_ 87