2010-11-21 14 views
1

Ich muss einen Dienst remote erstellen und lieber nicht zu einem Befehl ausbrechen und "sc \ remotemachine create ......" ausführen und es innerhalb des C# -Codes ausführen möchten.Der RPC-Server ist nicht verfügbar. Beim Aufruf von ManagementScope.Connect

Wenn jedoch der Code ausgeführt wird, obwohl der sc-Befehl ziemlich glücklich funktioniert und somit das ferne System verwaltet, löst der Aufruf von ManagementScope.Connect eine Ausnahme mit "Der RPC-Server ist nicht verfügbar" aus.

Ein Code-Snippet, das dies tut ist

string machineName = "othermachine"; 
string path = string.Format(@"\\{0}\root\cimv2", machineName); 
ManagementScope scope = new ManagementScope(path); 
scope.Connect(); 

, da dies auf die Reise über den ersten Schritt ist, ich bin ein bisschen stecken, wo als nächstes zu gehen. Die sc-Befehl funktioniert, so was ist es anderes zu tun (außer nicht .net-Bibliotheken - vielleicht muss ich die winapi schwerer treffen?)

Dank

+0

Sanity Check: Haben Sie versucht, nur mit 'othermachine', nicht mit root/cimv2 zu verbinden? – MPelletier

Antwort

2

Nachdem ich eine Weile darüber nachgedacht habe, wie viel Zeit für diese Aufgabe vergeudet wurde, habe ich die alte WIN32-API-Dokumentation veröffentlicht und [DllImport] die Aufrufe, die ich brauchte, um das "altmodisch" zu machen. Da ich ein alter C-Hund bin, kannte ich mich mit diesen Anrufen aus, erstaunlich, wie viel zurückkommt, selbst nach einigen Jahren, in denen ich die verwalteten Bibliotheken benutzt habe.

Was ich tun musste, war in der Lage, eine Dienstleistung zu erstellen, starten Sie es, tun Sie nützliche Arbeit, stoppen Sie es und löschen Sie es. Das Erstellen, Starten, Stoppen und Löschen sind Mechaniker und ich wollte mich auf den Teil der Aktivität "Nützliche Arbeit" konzentrieren.

Ich habe zuerst die Service-Exe in den ADMIN $ -Freigabe kopiert und verifiziert den lokalen Pfad dazu (mit unseren Server Admins gibt es keine Angabe!). Um dies zu tun ich

["netapi32.dll"]NetShareGetInfo 

rufen und dann habe ich folgendes mit von advapi32.dll

  • OpenSCManager
  • Create
  • Startservice
  • Openservice (für, wenn ich will stoppen und löschen Sie es - halten Sie nicht die Griffe offen, da dies eine Weile dauern kann, so sauber zu halten thns in sich geschlossen)
  • Co ntrolService
  • Query
  • CloseServiceHandle

Das alles funktioniert auch über die VPN-Verbindung.

Ich kann nur vermuten, dass die gemanagte API viel mehr zu tun versucht, als ich eigentlich brauche - der Zeitunterschied zwischen der verwalteten API und der Windows-API ist ziemlich groß und ohne Garantie, dass die gemanagte API dies auch tut durchzukommen war kein geeigneter Weg.

+0

Gute Gedanken zur Problemumgehung. Diese Situation ändert die ganze Frage, jetzt da es ein VPN-Problem ist .... – MPelletier

+0

Es wurde erst wirklich klar, nachdem ich gestern im Büro war und mein Code funktionierte, wo es nicht am Abend zuvor war. Einziger Unterschied war die Juniper VPN-Verbindung. –

0

Offensichtlich ist der Aktiencode von MSDN malt nicht die ganzes Bild. Ich bekomme die gleichen Ergebnisse wie du.

Überprüfen Sie, was dieser Typ did.

EDIT:

Ich glaube, Sie es auf einer Arbeitsgruppe und nicht einer Domäne sind versuchen, nicht wahr? Das ist der Trick, Arbeitsgruppen verlangen ein bisschen mehr Arbeit, um durchzukommen. Der obige Link scheint einen Workaround zu haben. Ich werde es heute Abend noch einmal versuchen.

+0

Nein, ich bin in einer Domain. Der Code funktioniert, wenn ich direkt mit dem LAN im Büro verbunden bin, aber das ist nur zwei Tage pro Woche. Der Rest der Zeit bin ich über eine VPN-Verbindung verbunden und der Code funktioniert nicht über diesen Link. SC und PSEXEC arbeiten gut in beiden Orten, die mich glauben, dass es grundlegende Unterschiede gibt - aber siehe Post unten ... –

+0

Um ehrlich zu sein habe ich eine andere Ausnahme, RPC-Zugriff verweigert, was ich dachte, dass zumindest etwas funktionierte richtig, wenn ich so weit wie geleugnet werden könnte. – MPelletier

Verwandte Themen