Ändern Sie die Windows-Dienst-Benutzer programmgesteuert

Muss ich ändern Logon-Benutzer für einen Windows-Dienst programmgesteuert. Und ich bin mit dem folgenden code tun:

string objPath = string.Format("Win32_Service.Name='{0}'", ServiceName);
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath)))
{
object[] wmiParams = new object[11];

if (PredefinedAccount)
    {
        wmiParams[6] = "LocalSystem";
            wmiParams[7] = "";
    }
    else
    {
        wmiParams[6] = ServiceUsername; //provided by user
            wmiParams[7] = ServicePassword; //provided by user
    }

    object invokeResult = service.InvokeMethod("Change", wmiParams);

//handle invokeResult - no error up to this point
}

Dieser code funktioniert in 90% der Situationen, aber in einigen Situationen-Dienst kann nicht gestartet werden aufgrund Anmeldung fehlgeschlagen. Es ist in der Regel kein Fehler auf InvokeMetod aber wenn wir versuchen, den Dienst zu starten erhalten wir folgenden Fehler:

System.InvalidOperationException: kann Nicht starten Dienst X auf computer
'.'. --> System.ComponentModel.Win32Exception: Der Dienst antwortete nicht
start aufgrund eines Anmeldefehlers.

Den workaround-Lösung ist einfach, wir müssen nur geben Sie die gleichen Anmeldeinformationen, die über Windows-Oberfläche und problem ist gelöst.

Also meine Frage ist, hat jemand erlebt, das ähnliche problem mit ManagementObject, weil es scheint, dass in einigen situation, Sie bezieht sich nicht Benutzername und Passwort für den windows-Dienst?

  • Ich Frage mich, ob es aufgrund Ihrer Anweisung. Was ich meine, ist das ManagementObject immer zerstört, bevor es erlaubt ist, zu vervollständigen? Ich bin nicht allzu vertraut mit WMI, also ich bin mir nicht sicher.
  • Da der Benutzername und das Kennwort wird vom Benutzer eingegeben, würde ich schauen, gibt es für Probleme. Stellen Sie sicher, Sie sind gültige Namen. "DOMÄNE\Benutzername" ist gut in jedem system, aber 'Benutzername@DOMÄNE' funktioniert nicht in Windows 2000 und früher.
  • Wir haben das gleiche problem und ich bin mir ziemlich sicher, dass der Dienst installiert wurde mit einem C#, .net 1.1 installation das Programm. Ich starte den Dienst über die Befehlszeile ('net start') und erhalten Sie logon failure. Seltsam dies geschieht mit 2 von 7 services, die auf dem Computer installiert sind (wahrscheinlich mit der gleichen Installations-code). Ich habe Sie nicht bekommen, um zu diagnostizieren, es noch nicht, aber die Maschine ist windows server 2003 mit den neuesten service-packs. Die Dienstleistungen c# .net 2.0-code. Tippen Sie das Kennwort manuell behebt es bis zum Neustart.
  • Ja, wir werden Sie zu zwingen, geben Sie als Benutzername "DOMÄNE\Benutzername'.
  • Ich denke, HVS ersten Kommentar hat einige Verdienste. Es ist möglich, dass das WMI-Objekt wird entsorgt, bevor die Anmeldung abgeschlossen ist, vor allem, wenn die Anmeldung berät eine domain oder ein Verzeichnis gesteuert auf einer anderen Maschine. Anmeldeinformationen möglicherweise zwischengespeichert werden, nachdem sich der Benutzer interaktiv anmeldet, die möglicherweise erklären, warum es dann für Sie arbeitet. Versuchen Schleifen über etwas, das testet die Anmeldung, das halten Sie das WMI-Objekt lange genug am Leben, um sich anzumelden. Oder entfernen Sie die using-Anweisung.
  • Okey, werde das tun. Ich Berichte in paar Wochen, wenn es geholfen hat. Danke.
  • Seltsamerweise habe ich gerade behoben, unser problem durch die Verwendung von Benutzername@Domäne syntax. Es war w2003 server mit sp2.

InformationsquelleAutor Anne | 2009-06-07
Schreibe einen Kommentar