2017-02-01 6 views
0

ローカルシステムアカウントとデスクトップとのインタラクトチェックボックスにチェックが入っているインタラクティブウィンドウサービスがあります(これは私のサービスでは必須です。 UI)。ネットワークドライブへの書き込み中にアクセスが拒否されたため、例外が発生します。私は設定ファイルからUNCパスを渡しています。私はアクセスしようとしているフォルダー上の匿名ユーザーにフルコントロールアクセスを与えようとしましたが、まだ動作していません。ネットワークサービスアカウントの下でWindowsサービスを実行することはできません。他のポストで提案されているように他のアカウントの下に置くこともできません。これを達成する方法はありますか?ネットワークドライブへの書き込み中にアクセスが拒否されたWindowsサービス

編集:ネットワークドライブのUNCパス://サーバー/ ABC/PQR

私のサービスは、PQRフォルダ内の.txtファイルを作成する必要があります。あとでそれを削除するアクセス権も必要です。

私はpqrフォルダ用の匿名ユーザーを作成しようとしていますが、完全に制御できますが、まだアクセス拒否例外が発生しています。前に述べたように、ローカルシステムアカウント以外のアカウントでは実行できません。そのサービスのプロパティでデスクトップオプションとの対話を自動的に無効にするためです。それがネットワークサービスアカウントの下で実行され、それでもインタラクティブ(サービスのプロパティでチェックされたデスクトップオプションと対話する)を保つ方法はありますか?

+0

が実際に「匿名」のユーザーを介して行わアクセスです(スニペットは、プロジェクトサイトから取られましたか)?私はそうは思わない。あなたは "すべて"のターゲットを開くことができますが、これは管理者によってむしろ嫌われています:)ユーザーがアクセスを拒否された(ターゲットマシンの)Windows EventLogに表示されますか? – Fildor

+0

「デスクトップとやりとりする」機能を持たなければならないと言っているのですが、標準的なソリューションを使用することを妨げるのはその点です。*標準的な回避策があります(コードをサービスコードとUIコードに分離し、ユーザーがログインしてRPCを使用して2つのコードセットが通信できるようにする)。 –

答えて

0

あなたはこのようなあなたのリモートのファイルの場所にアクセスするために使用するコードをラップでした。この方法でSimpleImpersonation

という名前の次ナゲットパッケージを使用してみてください:それは私のために働い

using (Impersonation.LogonUser(domain, username, password, logonType)) 
{ 
    // do whatever you want as this user. 
} 

。私はそれをオンにして、リモートからWindowsサービスをオフに使用しました。このように:

await Task.Factory.StartNew(() => 
      { 
       using (
        Impersonation.LogonUser(serviceInfo.Domain, serviceInfo.User, serviceInfo.Pswd, 
         Environment.MachineName.Equals(serviceInfo.ComputerName, 
          StringComparison.InvariantCultureIgnoreCase) 
          ? LogonType.Network 
          : LogonType.Interactive)) 
       { 
        var service = new ServiceController(serviceInfo.ServiceName, serviceInfo.ComputerName); 
        if (service.Status == ServiceControllerStatus.Stopped) 
        { 
         service.Start(); 
         service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(60)); 
        } 
        else 
        { 
         service.Stop(); 
         service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60)); 
        } 
       } 
      }); 

関連する問題