WMI - Methodenaufruf (Beispiel)
-
Quellen:
WMI Klassen: http://msdn.microsoft.com/en-us/library/windows/desktop/aa394084(v=vs.85).aspx
Win32_Process: http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx#properties
Win32_Process(Create): http://msdn.microsoft.com/en-us/library/windows/desktop/aa389388(v=vs.85).aspx
ManagementClass: http://msdn.microsoft.com/en-us/library/system.management.managementclass.aspx
ManagementScope: http://msdn.microsoft.com/en-us/library/system.management.managementscope.aspx
ManagementPath: http://msdn.microsoft.com/en-us/library/system.management.managementpath.aspx
ObjectGetOptions: http://msdn.microsoft.com/en-us/library/system.management.objectgetoptions.aspxHier ein Beispiel dazu, wie man in C++/CLI die Methode einer WMI Klasse aufruft.
#include "stdafx.h" #using <System.Management.dll> using namespace System; using namespace System::Management; int main(array<System::String ^> ^args) { /* WMI Methodenaufruf Lokal*/ ManagementClass ^mClass = gcnew ManagementClass("Win32_Process"); //Methodenname String ^method = "Create"; //Parameter [in] [in] [in] [out] array<Object^> ^arguments = {"cmd.exe", nullptr, nullptr, nullptr}; //Funktionsaufruf Object ^errorCode = mClass->InvokeMethod(method, arguments); //Ausgabe des Rückgabewertes (Error Code) Console::WriteLine("Error Code: \t {0}", errorCode->ToString()); //Ausgabe des [out] Parameters (Process ID) Console::WriteLine("Process ID: \t {0}", arguments[3]->ToString()); Console::Write("\nPress Enter to exit..."); Console::ReadLine(); delete mClass, method, arguments, errorCode; return 0; }
Die Remote Variante
#include "stdafx.h" #using <System.Management.dll> using namespace System; using namespace System::Management; int main(array<System::String ^> ^args) { /*WMI Methodenaufruf Remote*/ ManagementPath ^mPath = gcnew ManagementPath("Win32_Process"); ManagementScope ^mScope = gcnew ManagementScope("\\\\" + Environment::MachineName + "\\root\\cimv2"); //Verbindungsinformationen mScope->Options->Username = nullptr; mScope->Options->SecurePassword = nullptr; //Verschlüsseltes Passwort ObjectGetOptions ^options = gcnew ObjectGetOptions(); ManagementClass ^mClass = gcnew ManagementClass(mScope, mPath, options); //Methodenname String ^method = "Create"; //Parameter [in] [in] [in] [out] array<Object^> ^arguments = {"cmd.exe", nullptr, nullptr, nullptr}; Object ^errorCode = mClass->InvokeMethod(method, arguments); //Ausgabe des Rückgabewertes (Error Code) Console::WriteLine("Error Code: \t {0}", errorCode->ToString()); //Ausgabe des [out] Parameters (Process ID) Console::WriteLine("Process ID: \t {0}", arguments[3]->ToString()); Console::Write("\nPress Enter to exit..."); Console::ReadLine(); delete mPath, mScope, options, mClass, method, arguments, errorCode; return 0; }
-
Ich würde noch ein
delete mClass;
hinzufügen um Dispose() aufzurufen.
-
theta schrieb:
Ich würde noch ein
delete mClass;
hinzufügen um Dispose() aufzurufen.
Danke für den Hinweis, hab es hinzugefügt.
-
theta schrieb:
Ich würde noch ein
delete mClass;
hinzufügen um Dispose() aufzurufen.
Braucht man in C++/CLI nicht zwangsweise...
-
Felix LG schrieb:
theta schrieb:
Ich würde noch ein
delete mClass;
hinzufügen um Dispose() aufzurufen.
Braucht man in C++/CLI nicht zwangsweise...
Wäre aber auch nicht falsch, wenn man an es an den richtigen Stellen nutzt.
-
Felix LG schrieb:
theta schrieb:
Ich würde noch ein
delete mClass;
hinzufügen um Dispose() aufzurufen.
Braucht man in C++/CLI nicht zwangsweise...
Falls Du die alternative schreibweise ohne ^ meinst (a la auto Variablen) - Einverstanden (denn da wird Dispose() beim verlassen des Scopes auch aufgerufen).
Andernfalls braucht man Dispose() genauso zwangsweise aufzurufen (via delete) wie in C# (z.B. mit using).