2009-06-07 26 views
9

Potrzebuję programowo zmienić użytkownika logowania dla usługi systemu Windows. I używam następujący kod, aby to zrobić:Programistycznie zmieniaj użytkownika usługi systemu Windows

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 
} 

Ten kod działa w 90% sytuacji, ale w niektórych sytuacjach usługi nie można uruchomić z powodu Niepowodzenie logowania. Zwykle nie ma błędu InvokeMetod ale gdy staramy się uruchomić usługę otrzymujemy następujący błąd:

System.InvalidOperationException: Cannot start service X on computer '.'. --> System.ComponentModel.Win32Exception: The service did not start due to a logon failure.

Rozwiązanie Rozwiązaniem jest prosta, po prostu trzeba wprowadzać tych samych danych za pośrednictwem interfejsu systemu Windows i problem został rozwiązany.

Moje pytanie brzmi, czy ktokolwiek doświadczył podobnego problemu z ManagementObject, ponieważ wydaje się, że w niektórych sytuacjach nie dotyczy on nazwy użytkownika i hasła do usługi Windows?

+1

Zastanawiam się, czy to z powodu swojej użyciu instrukcji. Mam na myśli to, że ManagementObject zostaje zniszczony, zanim zostanie ukończony? Nie jestem zbyt zaznajomiony z WMI, więc nie jestem pewien. – HVS

+0

Ponieważ nazwa użytkownika i hasło są wprowadzane przez użytkownika, szukałbym tam również problemów. Upewnij się, że są to prawidłowe nazwy. "DOMAIN \ nazwa_użytkownika" jest dobre w każdym systemie, ale "nazwa użytkownika @ DOMAIN" nie działa w systemie Windows 2000 i wcześniejszych wersjach. – HVS

+0

Mamy ten sam problem i jestem pewien, że usługa została zainstalowana za pomocą programu instalacyjnego C#, .net 1.1. Uruchomię usługę z wiersza poleceń ("net start") i otrzymuję komunikat o błędzie. Co dziwne, dzieje się tak w przypadku 2 z 7 usług zainstalowanych na komputerze (prawdopodobnie przy użyciu tego samego kodu instalacyjnego). Nie udało mi się go jeszcze zdiagnozować, ale maszyna to serwer Windows 2003 z najnowszymi dodatkami Service Pack. Usługi to kod C# .net 2.0. Wpisanie hasła ręcznie powoduje jego naprawę do czasu ponownego uruchomienia. – LegendLength

Odpowiedz

0

Czy zauważasz jakieś wzorce wśród tych awarii? Ta sama maszyna? Ten sam system operacyjny? Ten sam użytkownik? Czy użytkownik ma prawa "logon as service" lub "logowanie interaktywne"? Osobiście nie znam tej metody określania użytkownika usługi. Myślałbym, że będziesz musiał ponownie uruchomić usługę, ale chyba nie, jeśli działa 90% czasu.

+0

To zależy od różnych systemów operacyjnych. Nie ma wzoru. Czasami zdarza się to, gdy hasło jest krótkie (mniej niż 7 znaków). We wszystkich tych przypadkach problem został rozwiązany, gdy użytkownik wprowadził tę samą nazwę użytkownika i hasło za pośrednictwem domyślnego interfejsu systemu Windows. Zakładamy więc, że jest to coś w naszym kodzie lub w ManagementObject, którego używamy. – Anne

9

Nie jestem pewien, czy problem został rozwiązany. Ale właśnie napotkaliśmy podobny problem i doszliśmy do wniosku, że dzieje się tak, ponieważ konto nie ma przywileju "Logowanie jako usługa". Aby dodać takie przywileje do konta, musisz użyć LsaAddAccountRights.

Zobacz ten artykuł proszę:

How To Manage User Privileges Programmatically in Windows NT

+0

Genialny !!! To był mój problem, dziękuję za opublikowanie tego. – lidermin

Powiązane problemy