Laden...

Wie kann ich über WMI auf Remotecomputer bspw. Festplatten erweitern?

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.402 Views
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
Wie kann ich über WMI auf Remotecomputer bspw. Festplatten erweitern?

Hallo,

ich bekomme eine Remote Verbindung zu meinem Remote Server her und kann mir die dort verfügbaren Platten anzeigen lassen.

Ich würde gerne die vorhandenen Festplatten erweitern, jedoch finde ich hierzu im Netz nur sehr wenig. Es müßte doch möglich sein, WMI so zu benutzen, das ich die Verbindung benutzen kann um dort Dinge auszuführen, wie z.bsp. erweitern etc.

Hat irgendjemand eine Idee, wo ich fündig werde, bzw. einen Lösungsansatz, den ich verwenden darf ?

Liebe Grüße

bis jetzt habe ich ...


...
serviceScope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3");
string sVolumeLabel = "";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(serviceScope, query);
                    foreach (ManagementObject WMIInfo in searcher.Get())
                    {
                        if (string.IsNullOrEmpty(Convert.ToString(WMIInfo["VolumeName"])))
                        {
                            sVolumeLabel = "Local Disk";
                        } else
                        {
                            sVolumeLabel = Convert.ToString(WMIInfo["VolumeName"]);
                        } 
                        string sSystemName = Convert.ToString(WMIInfo["SystemName"]); 
                        string sDriveLetter = Convert.ToString(WMIInfo["Name"]);
                        decimal dSize = Math.Round((Convert.ToDecimal(WMIInfo["Size"]) / 1073741824), 2); 
                        decimal dFree = Math.Round((Convert.ToDecimal(WMIInfo["FreeSpace"]) / 1073741824), 2); 
                        decimal dUsed = dSize - dFree;
                        int iPercent = Convert.ToInt32((dFree / dSize) * 100);
                        TrackData("Data:", "Drive " + sVolumeLabel.ToString() + " Name:" + sDriveLetter.ToString() + " Größe: " + dSize.ToString() + " FreeSpace: " + dFree.ToString() + " Usage: " + iPercent.ToString() + " %", context);
                    }

ich habe auf Windows Resource zu Expand VHDs da etwas gefunden, verstehe auch zum Teil den Ansatz per InvokeMethod die Funktion aufzurufen, allerdings habe ich noch verständnisprobleme, wie er den Methodenaufruf macht und wie ich den Scope so setzen kann, das er trotz bestehender Verbindung, auf die virtualisierung zugreift.

16.807 Beiträge seit 2008
vor 5 Jahren

Du musst Dir prinzipiell im Klaren sein, dass WMI a) schon einige Zeit auf dem Buckel hat und b) die Dokumentation dürftig ist.
Ohne sich tiefer mit WMI zu beschäftigen - und PInvoke - wirst Du keine schnellen Resultate erreichen.

WMI wird so selten verwendet, dass die Wahrscheinlichkeit gering ist, dass Du auf Anhieb jemand findest, der die Lösung kennt.
Da musst Du Glück haben - oder so viel Glück, dass jemand die Zeit und Lust sich da einzulesen, um zu helfen.

Weiter verbreitet ist mittlerweile PowerShell.
Und mit C# kannst Du ebenfalls PowerShell auszführen - und mit PowerShell kannst Du C#-Code ausführen.

PS: WMI wurde auch durch MI (Windows Management Infrastructure) abgelöst.
Dass die Langfassung ebenfalls mit WMI abkürzbar ist, ist etwas unglücklich.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Die Lösung über Powershell hab ich schon, die funktioniert auch, ist aber nicht gewünscht. Leider.

Jetzt muß ich mich durch sämtliche möglichen Referenzen durcharbeiten, kennt keiner n gutes Buch dazu ? Das wäre mir natürlich lieber, als unbefriedigte Suchen über google.

Danke für Hilfe

C
1.214 Beiträge seit 2006
vor 5 Jahren

Dein Link funktioniert nicht.
Was heißt überhaupt "erweitern"?

709 Beiträge seit 2008
vor 5 Jahren

Dein Link funktioniert nicht.

Da ist ein "http://" am Ende zu viel dran.
Hier der korrigierte Link: ExpandVirtualHardDisk method of the Msvm_ImageManagementService class

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Hallo Coder007.

Mit erweitern meinte ich (sorry das war etwas unglücklich gewählt von mir). Partitionen erweitern.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

ein paar Sachen hab ich glaube ich herausgefunden.

Diese besagte Expand Virtual Disk Sache, die von Microsoft angegeben wird, scheint nur mit Hyper-V Virtualisierungen zu funktionieren. Korrigiert mich, wenn ich hier falsch liege. Und das ganze ist auch nur lokal anwendbar. Auf einem Remote Computer, wo die VHD liegt, komm ich so nicht ran.

Also bleibt mir doch wieder nur die DeviceIOControl-API. Hmpf.

Wieso stellt denn Microsoft, keine vernünftige Referenz bzw. Beispiele bereit. Ich hab schon tage verbracht das internet zu durchforschen. Bücher gibts auch keine. Bin etwas frustriert im Moment.

3.511 Beiträge seit 2005
vor 5 Jahren

Ich verstehe ehrlich gesagt jetzt nicht genau, was du überhaupt vorhast?

Auf einem Remote Computer, wo die VHD liegt, komm ich so nicht ran

Ich würde gerne die vorhandenen Festplatten erweitern

Willst du jetzt eine physische Partition erweitern, oder eine virtuelle? Irgendwie widerspricht sich das gerade 😃

Bei virtuellen Platten/Partitionen einfach die entsprechenden APIs der jeweiligen Anbieter nutzen und bei physischen einfach DiskPart "fernsteuern". Warum dieses ganze mit Kanonen auf Spatzen schießen? Warum muss es unbedingt und zwanghaft in c# reinprogrammiert werden, wenn es schon gute und fertige Lösungen von MS selber gibt (DiskPart)?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Hallo Khalid,

ich konnte jetzt diese Diskussion Gott-Sei-Dank in eine andere Richtung lenken. Mittlerweile ist man bereit, über MS-Tools wie DiskPart - die Platten zu erweitern. Ich versteh auch nicht, warum erst diese "hardwarenahe" Lösung fokusiert wurde.

Ich soll natürlich eine physische Partition erweitern. Mir ist klar, das das keine virtuelle Disk ist. Ich habe auch hierzu ein paar Rücksprachen gehabt, da man hier ja auch direkt auf die .vhd Datei verweisen muß, wenn man diese erweitern will - aber die Diskussion ist jetzt dahingehend gelöst, das ich erst mal nur physische Partitionen über Diskpart erweitern soll.

Ich halte euch auf dem laufenden.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

so...

wmi verbindung steht... username passwort alles auf remote maschine gesetzt...


servicePath = "\\\\Testserver\\root\\cimv2";
var options = new ConnectionOptions();
options.EnablePrivileges = true;
options.Username = username;
options.Password = pwd;
serviceScope = new ManagementScope(servicePath, options);
serviceScope.Connect();

im prinzip müßte ich diesen Code ausführen...


Process process = new Process();
process.StartInfo.FileName = "diskpart.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.StandardInput.WriteLine("list volume");
process.StandardInput.WriteLine("exit");
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit()

da das so in der form nicht funktioniert (bzw. nur lokal und auch nur mit admin rechten)... versuch ich das ganze an WMI zu übergeben...


object[] theProcessToRun = { "diskpart" };
using (var managementClass = new ManagementClass(serviceScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
managementClass.InvokeMethod("Create", theProcessToRun);
}

wie bekomme ich jetzt die InvokeMethod dazu, in den aktiven Prozess in die Commandozeile, "List volume", "exit", bzw. andere befehle zu übergeben und wie kriege ich den Output zurück ?

hat da jemand ne idee ?

Liebe Grüße

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Ok, ich kann eine Scriptdatei auf dem RemoteRechner installieren und das über Diskpart aufrufen lassen, soweit ich das gesehen habe, ist auch eine Ausgabe in eine Textdatei möglich, was später sehr nützlich sein kann.

Leider ist es wohl nicht möglich, Diskpart 2 Commands gleichzeitig mitzugeben, Versuche wie mit && oder zu pipen mißlangen.

Gibts hier evtl. doch noch ne alternative ?

3.511 Beiträge seit 2005
vor 5 Jahren

Du kannst DiskPart eine ScriptDatei mitgeben, in der mehrere Commands drin stehen und dann DiskPart mit "DiskPart /s ScriptDatei" aufrufen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

irgendwie stell ich mich behindert an.

ich hab extra zu testzwecken auf dem Server eine textdatei angelegt mit dem Namen "sample.txt".

Aufgerufen wird die datei mit "diskpart /s sample.txt".

In der sample.txt steht folgendes:

select volume F
extend size=5000

beim aufruf, auf der virtuellen Maschine, passiert nichts. Ich kriege das optionenmenü angezeigt. Hab ich irgendwas übersehen ?

Gebe ich obige befehle in diskpart direkt ein, funktioniert alles. Scheint fast so als würde er die Scriptdatei nicht lesen. What the hell i am doing wrong ?

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

ok, habs, die Codierung war auf Unicode und gehört auf ANSI.

Danke Internet !

U
135 Beiträge seit 2009
vor 5 Jahren

irgendwie stell ich mich behindert an.

Auf die Gefahr hin, dass ich als Moralapostel da stehe 😉

Auch wenn es sicherlich nicht böse gemeint war, so doch zumindest gedankenlos: solche Aussagen müssen IMHO nicht sein. Sei froh, dass Du (zumindest unterstelle ich das mal 😉) wie auch ich, an keiner Behinderung leidest. Ich persönlich finde es nicht in Ordnung "behindert" als Synonym für "doof" zu verwenden und genau das tust Du IMHO hier.
Nur so als Denkanstoß, vielleicht sparst Du Dir sowas künftig 😃