Laden...

Registry am Remote - Computer ändern

Erstellt von illusionslos vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.525 Views
I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren
Registry am Remote - Computer ändern

Hallo zusammen,

ich arbeite gerade an einem kleinen Projekt. Bisher lief es ganz gut, doch jetzt brauch ich einfach Hilfe von Fachleute. Ich versuch aktuell per Funktion die Registry - Einträge für den USB - Port zu ändern. Lokal auf meinem Rechner funktioniert es auch, leider habe ich nicht herausgefunden wie ich die Befehle auf dem Remote - Rechner ausführen lasse. Bei allen Varianten bekomme ich den Fehler Netzwerkpfad nicht gefunden. Ich habe unten mal meinen aktuellen Code für die Funktion angehangen. Der funktioniert so aber nur lokal.

Ich hoffe ihr könnt mir weiterhelfen oder mich in die richtige Richtung geleiten.


            if (Registry.GetValue(@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\USBSTOR", "Start", "").ToString() == "4")
            {
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\USBSTOR", "Start", 3);
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\USBSTOR", "ImagePath", @"System32\DRIVERS\USBSTOR.SYS");
            }
            else
            {
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\USBSTOR", "Start", 4);
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\USBSTOR", "ImagePath", @"System32\DRIVERS\USBSTOR2.SYS");
            }

Grüße

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo und willkommen im Forum,

schau mal in Entfernte Registry warten

Es läuft darauf hinaus, entweder einen Dienst zu schreiben der auf dem Remotecomputer läuft, und einen Client, der mit dem Dienst kommuniziert, oder aber den vorhandenen Remoteregistrierungs-Dienst zu nutzen und Remoteadministration zu aktivieren.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Hallo,

danke für deine Antwort. Ich hatte deinen Beitrag dazu schon über die Suche gefunden. Leider habe ich jedes mal einen Fehler beim zuweisen des enviromentKey. (Siehe Code unten)

Die Exception lautet: "Der Netzwerkpfad wurde nicht gefunden."

Ich habe es so verstanden, dass ich bei remoteName nur den Remote - Rechner eintragen muss. Ich habe es über den Namen und über die IP versucht.


                    environmentKey = RegistryKey.OpenRemoteBaseKey(
                        RegistryHive.CurrentUser, remoteName).OpenSubKey(
                        "EnviromentKey");

Ich hatte gehofft es gibt eine einfachere Variante um auf den Remote - Rechner zuzugreifen, weil meine Abfrage zum ändern des Keys prinzipiell funktioniert.

Gruß

16.834 Beiträge seit 2008
vor 7 Jahren

Software ist nicht immer einfach. Deswegen ist es ein eigener Beruf, für den die meisten studieren.
Arg kompliziert ist das Snippet in der Doku übrigens nicht.
Sind nur eine Hand voll Zeilen..

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Ich wollte hier niemanden angreifen. Ein Studium wollte ich aber dafür nicht extra beginnen. Was für jemanden kompliziert ist und was nicht, ist auch individuell abhängig von der Person. Darum suche ich Hilfe im Forum, in dem mir studierte Programmierer etwas unter die Arme greifen und mir die Punkte genauer erklären. Aus meiner Sicht wäre das Forum überflüssig, wenn sich nur Experten hier rumtreiben.

Hinweis von Abt vor 7 Jahren

Bitte keine Fullquotes

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,
1.Ist das Netzwerk richtig konfiguriert (Netzerkerkennung, Firewall etc.)? 1.laufen auf beiden Rechnern die Dienste "Remoteregistrierung" und "Windows-Remoteverwaltung"? 1.Hast Du mit dem Konto, unter dem Du das versuchst, Admin-Rechte auf dem Remoterechner? 1.Stecken die beteiligten Rechner eigentlich in einer Domäne? Bedenke jedenfalls, dass Du mit RegistryHive.CurrentUser auf einem Remoterechner nicht unbedingt da landest, wo Du willst.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Hallo,

die Fehlermeldung konnte ich beheben. Vielleicht besteht sie auch noch, gibt nur keinen Fehler mehr zurück.

Die Dienste aktivieren war auch schon mal ein interessanter Tipp.

Jedoch spuckt er mir immer noch nur den Key vom lokalen Rechner aus.
Nach meinem Verständnis passiert folgendes im Code unten:
Er öffnet den Key auf dem Remote - Rechner, denn ich habe ja eine Variable (remoteName) hinzugefügt. Dort geht er in das Verzeichnis HKEY_LOCAL_MACHINE. Dann schaut er weiter bis USBSTOR.

In der Ausgabebox nimmt er den environmentKey der doch den Pfad zum Remote - Rechner darstellt oder? Trotzdem gibt er mir hier den vom lokalen Rechner aus.



                // Open HKEY_CURRENT_USER\Environment 
                // on a remote computer.
                environmentKey = RegistryKey.OpenRemoteBaseKey(
                    RegistryHive.LocalMachine, remoteName).OpenSubKey(
                    @"System\CurrentControlSet\Services\USBSTOR");
          
                // Print the values.
                MessageBox.Show(Registry.GetValue(environmentKey.Name, "Start", 0).ToString(), "Test", MessageBoxButtons.OK, MessageBoxIcon.Information);

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

da die Registry.GetValue-Methode nur einen String als Namen für den Key annimmt, wirst Du damit vermutlich immer nur auf dem lokalen Rechner landen.

Benutze zum Auslesen/Setzen der Werte die GetValue- und SetValue-Methoden des RegistryKey-Objektes selbst.
In dem Beispielcode in der Doku wird das auch so gemacht - bitte in Zukunft die etwas genauer lesen 😉

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Hallo,

vielen Dank. Das war der richtige Wink. 😃


MessageBox.Show(environmentKey.GetValue("Start").ToString(), "Test", MessageBoxButtons.OK, MessageBoxIcon.Information);

Das Thema kann prinzipiell geschlossen werden. Danke für die Hilfe.

Gruß

Hinweis von Abt vor 7 Jahren

Bitte keine Fullquotes

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Hat sich erledigt, habe eine Lösung gefunden.

In der Commandzeile: "/c sc config Remoteregistry Start=Disabled"
kann man nach sc den Zielcomputer eintragen \Rechnername.

Hallo,

da das Thema noch offen ist, hätte ich doch noch eine kleine Frage dazu.

Den Registry - Eintrag kann ich dank eurer Hilfe wunderbar ändern. Leider ist es Voraussetzung, dass der "Remoteregistry" - Dienst läuft. Bisher habe ich es geschafft, den Dienst zu starten und wieder zu stoppen.

Leider ist der Dienst standardmäßig deaktiviert. Bisher habe ich noch keine Lösung gefunden, den Dienst auf den Remotegeräten zu aktivieren/deaktivieren.

Für meinen lokalen Rechner habe ich diese Lösung:


            P.StartInfo.FileName = "cmd.exe";
            P.StartInfo.CreateNoWindow = false;
            P.StartInfo.Verb = "runas";
            P.StartInfo.Arguments = "/c sc config Remoteregistry Start=Disabled";
            P.Start();

Kann ich irgendwo einen Parameter setzen, dass die Zeile auf dem Remotegerät ausgeführt wird?

Gruß

2.298 Beiträge seit 2010
vor 7 Jahren

Hallo,

du kannst den Dienst mit Hilfe der ServiceController-Klasse starten und anschließend den Wert in der Registry ändern.

Der ServiceController stellt dabei entsprechende Methoden zum Start des Dienstes auf dem Remote-Rechner bereit.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Ja, da liegst du richtig. Leider kann man keinen Dienst starten, wenn der Starttyp auf "deaktiviert" ist. Ich habe es mittlerweile geschafft über cmd.exe den Dienst auf dem Remotegerät zu starten.

Leider funktioniert es nicht, wenn ich es mit C# versuche. Ich glaube er stört sich an dem /c (siehe Code) beim Argument. Mir fällt bisher keine Lösung ein, wie ich mir anzeigen lassen kann, was er genau ausführt.


            Process P = new Process();

            P.StartInfo.FileName = "cmd.exe";
            P.StartInfo.UseShellExecute = true;
            P.StartInfo.Verb = "runas";
            P.StartInfo.Arguments = "/c sc \\Remotegerät config Remoteregistry Start=Demand";
            P.Start();

16.834 Beiträge seit 2008
vor 7 Jahren

[FAQ] Was bedeutet das @ (=at) vor String-Literalen? Und: Wissenswertes zu Escape-Sequenzen

Du brauchst \\\\Remotegerät oder @".... \\Remotegerät ..."

I
illusionslos Themenstarter:in
8 Beiträge seit 2016
vor 7 Jahren

Vielen Dank. Damit hat es geklappt. Das die Kommandos dadurch ignoriert werden, wusste ich nicht.

D
261 Beiträge seit 2015
vor 7 Jahren

... Mir fällt bisher keine Lösung ein, wie ich mir anzeigen lassen kann, was er genau ausführt. ...

Mit dem Process Monitor kann man das gut nachvollziehen.

16.834 Beiträge seit 2008
vor 7 Jahren

Sie werden nicht ignoriert, sondern falsch ausgeführt, weil Du Dich nicht an den Syntax und die Escape-Zeichen-Regeln gehalten hast.
Im Hintergrund gab es mit Sicherheit einen entsprechenden Fehler.

Da Du aber die Ausgabe der Ausführung gar nicht abfängst, siehst Du diesen auch nicht.