2009-06-07 7 views
9

Windowsサービスのログオンユーザーをプログラムで変更する必要があります。そして、私はそれを行うには、次のコードを使用しています: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 
} 

このコードは、状況の90%で動作しますが、状況によってはサービスにログオンに失敗したため、起動することはできません。そこInvokeMetod上のエラーは、通常ではありませんが、我々は、我々は次のエラーを取得するサービスを開始しようとすると:

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

回避策ソリューションは単純で、私たちは解決され、Windowsのインターフェイスと問題を経由して同じ資格情報を入力する必要があります。

私の質問は、誰かがManagementObjectで同様の問題を経験したことがあります。これは、状況によってはUsernameとパスワードをWindowsサービスに関連させていないようです。

+1

それはあなたのusingステートメントが原因である場合、私は疑問に思います。私が意味することは、ManagementObjectが完了する前に破棄されることですか?私はWMIに精通していないので、わかりません。 – HVS

+0

ユーザー名とパスワードが入力されているので、私もそこに問題がないか調べます。それらが有効な名前であることを確認してください。 「DOMAIN \ username」はどのシステムでも良いですが、Windows 2000以前では「username @ DOMAIN」は機能しません。 – HVS

+0

私たちは同じ問題を抱えており、サービスがC#、.net 1.1インストールプログラムでインストールされていることを確信しています。私はコマンドライン( 'net start')からサービスを開始し、ログオンに失敗します。不思議なことに、これはマシンにインストールされている7つのサービスのうち2つ(おそらく同じインストールコードを使用している)で発生します。私はそれをまだ診断することはありませんが、マシンは最新のサービスパックを備えたWindows 2003サーバーです。サービスは、C#.net 2.0のコードです。パスワードを手動で入力すると、再起動するまでパスワードが修正されます。 – LegendLength

答えて

0

これらの失敗のパターンはありますか?同じマシンですか?同じOSですか?同じユーザーですか?ユーザーが "logon as service"または "対話的にログオンする"権利を持っていますか?個人的には、私はサービスのためにユーザーを指定するこの方法に慣れていません。私はあなたがサービスを再起動する必要があるだろうと思っていただろうが、90%の時間で動作するかどうかはわからない。

+0

それはさまざまなOSに依存します。パターンはありません。パスワードが短い(7文字以下)場合に発生することがあります。 これらのケースでは、ユーザーがWindowsのデフォルトインターフェイス経由で同じユーザー名とパスワードを入力したときに問題が解決されました。だから私たちはそれが私たちのコードや、私たちが使用しているManagementObjectの中にあるものと推測します。 – Anne

9

この問題が解決するかどうかはわかりません。しかし、同様の問題が発生したばかりで、アカウントには「サービスとしてログオン」権限がないために問題が発生していることがわかりました。このような特権をアカウントに追加するには、LsaAddAccountRightsを使用する必要があります。

見るこの記事してください:

How To Manage User Privileges Programmatically in Windows NT

+0

ブリリアント!それは私の問題でした、これを投稿していただきありがとうございます。 – lidermin

関連する問題