2011-11-10 4 views
2

私はうまくいったカスタムインストーラプログラムを持っていますが、アプリケーションを更新するたびに管理者権限をユーザーに求めます。私はこの部分をスキップするWindowsサービスを作成していますが、Windowsサービスはファイルに対するシステムと管理者のアクセス権のみを与え、ユーザーは新しい更新を実行できません。 すべてのユーザーのためにc: program files company app fileのファイルアクセス権を設定しました

は、私は、ファイルのダウンロード後に(しようとしているこの問題を修正するには/ Windowsサービス内から(正しい場所にインストールし、それはアカウントServiceAccount.LocalSystem)、

FileSecurity access = file.GetAccessControl(); 
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
access.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.ReadAndExecute, AccessControlType.Allow)); 

を持っていますが、設定は」doesnのトン私はここから何をする必要があります。有効になる?

+0

'..しかし、アプリケーションを更新するたびに管理者権限をユーザに求めます。 –

+0

古い方法ですが、すでに管理者として実行されているサービスを介してダウンロードする場合は、いいえ。 Google Chromeを使用している場合は、更新する権限がないかどうかを尋ねることはありません。 Google Chromeをアップデートする「Google Update Service」のサービスを確認して、更新権限を昇格させないようにしてください。 –

+0

ああ大丈夫、そういう仕組みだよ。知っておいてよかった。 –

答えて

4

を、私はそれを考え出した。私はちょうど呼び出すために必要な、上記後

file.SetAccessControl(access); 

。どうやらfile.GetAccessControlはBAを渡します変更されたアクセス許可でfile.SetAccessControlを呼び出すまで、アクセスコントロールのコピーではなく、ファイルのファイルアクセス許可を制御するコピーではありません。私はサービスがCで作成された別のファイルを発見し、別の注意点があります

:\はProgramDataは、

  • はセットは、ファイルが書き込まれた後に発生することがあるということです。あらかじめファイルにセットを適用するのは効果がありません。
3

最近、ネットワークからファイルを読み込む際に問題が発生し、テストでバグを再現できるようにしたいと考えて、同じ問題が発生しました。

私はこのようなものを行うためのAPIはかなり恐ろしいと小さな落とし穴に満ちているとして、それを助けるために、以下の小さなクラスを思い付いた:

呼び出し元のコードは次のようになります。

 _permissionController = new PermissionController(_file); 
     _permissionController.Allow(FileSystemRights.Read, FileSystemRights.Write); 
     _permissionController.Deny(FileSystemRights.FullControl, 
            FileSystemRights.Modify, 
            FileSystemRights.ReadAndExecute); 
     _permissionController.Apply(); 

ここで、_fileは完全修飾パスです。

あなたはそれ以外の場合は影響がないよう、ルールを追加/削除した後

File.SetAccessControlを呼び出すように注意する必要があります。

APIを誤解していない限り、FileSystemRights列挙型はフラグを使用しないため、アクセス許可ごとにルールを追加する必要があります。

また、拒否された権利を許可することは、その権利を拒否するルールを削除することと同じではないことに注意してください。拒否された権限が許可された権限を無効にしたようです。

Windowsエクスプローラでファイルのプロパティのセキュリティタブを確認すると、結果を見ることができます。

+0

これはうれしいことです - サービスには所有者がないか、少なくともユーザーではないため、 '_id = WindowsIdentity.GetCurrent()。Owner; 'は使用できません。 Deniesを削除する必要があることのヒントをありがとう、私はそれについて知らなかった。 –

関連する問題