2011-06-30 1 views
1

を占め、私はC#を使用して、共通のアプリケーションフォルダ内のXMLファイルを作成しています。アプリケーションがインストールされている場合ユーザー

%ALLUSERSPROFILE%\Application Data\ 

ファイルが作成されます。このファイルは、ローカルマシンのすべてのユーザーに共通のものです(設定情報が含まれています)

しかし、私の問題は、管理者によってファイルが作成されたときです)、他のユーザーにはファイルへの書き込みアクセス権がありません。ファイルの属性をチェックすると、他のユーザーには「読み取りと実行」のみが与えられています。

私は、ファイルを保存するためのコードの下に使用しています

XDocument.Save(filePath); 

それはすべてのユーザーに与えられた書き込みアクセスでファイルを作成することは可能ですか?どんな助けも大変ありがとう!

答えて

2

パラメータをXDocument.Saveに渡してアクセス権を制御することはできませんが、保存後に設定する必要があります。以下のようなものが行う必要があります。

System.Security.AccessControl.FileSecurity fsec = System.IO.File.GetAccessControl(fileName); 
fsec.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Everyone", System.Security.AccessControl.FileSystemRights.Modify, System.Security.AccessControl.AccessControlType.Allow)); 
System.IO.File.SetAccessControl(fileName, fsec); 
+0

okありがとう、これはうまくいきました... – Lamps

+1

"EveryOne"を使用する代わりに、WellKnownSidType.WorldSidを使用します – Lamps

0

サービスのインストールで同様の問題が発生しました。次のコードを使用して、フォルダに異なるアクセス許可を与えることができます。

public static void CreateWithFullAccess(string targetDirectory) 
    { 
     try 
     { 
      if (!Directory.Exists(targetDirectory)) 
      { 
       Directory.CreateDirectory(targetDirectory); 
      } 
      DirectoryInfo info = new DirectoryInfo(targetDirectory); 
      SecurityIdentifier allUsersSid = 
      new SecurityIdentifier(WellKnownSidType.LocalServiceSid, 
      null); 
      DirectorySecurity security = info.GetAccessControl(); 
      security.AddAccessRule(
      new FileSystemAccessRule(allUsersSid, 
      FileSystemRights.FullControl, 
      AccessControlType.Allow)); 
      info.SetAccessControl(security); 
     } 
     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.ToString()); 
     } 
    } 
+0

これは、このフォルダの下に作成されたすべてのファイルは、すべてのユーザーに書き込み権限を持っていることを意味しますか? – Lamps

+0

それは正しいですが、私が必要としていたのは、特定のファイルに対して、FileInfoとFileSecurityを使用することができます。私は上記のDoctorMickのようでした。 – Jethro

+0

私は何か間違ったことをしたかもしれませんが、私にとっては、これはファイルやターゲットディレクトリの下に作成されたサブフォルダには影響しません。これはWindows 7です。 – RenniePet

4

あなたはXDocument.SaveメソッドにACLに関する情報を渡すことはできませんが、XMLドキュメントを保存した後、ファイルのパーミッションを変更することができます。あなたは(System.Security.dllへの参照を追加することを忘れないでください)、それを実行するには、次のコードを使用することができます。

using System.Security.AccessControl; 
using System.Security.Principal; 
using System.IO; 

public class FileAccessRulesHelper 
{ 
    public void AddWriteRightsToEveryone(string filename) 
    { 
     // get sid of everyone group 
     SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
     // create rule 
     FileSystemAccessRule rule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow); 
     // get ACL of file 
     FileSecurity fsecurity = File.GetAccessControl(filename); 
     // modify ACL of file 
     fsecurity.AddAccessRule(rule); 
     // apply modified ACL to file 
     File.SetAccessControl(filename, fsecurity); 
    } 
}