メインの仮想ディレクトリ フォルダーの下にあるフォルダーに書き込む必要がある ASP.NET アプリをインストールするために、Web セットアップ プロジェクトを使用しています。ASPNET ユーザーにそのフォルダーへのアクセス許可を付与するようにセットアップ プロジェクトを構成するにはどうすればよいですか?
質問する
2066 次
1 に答える
6
その方法は、 から派生したクラスを作成することですSystem.Configuration.Install.Installer
。メソッドをオーバーライドしInstall()
ます。以下は、ディレクトリとファイルのアクセス許可を変更する例です。おそらくそれほど寛容になりたくないでしょうが、それはセキュリティ コンテキストに依存します。これを機能させるには、セットアップ プロジェクトでこれをカスタム アクションとして実行する必要があります。このクラスが含まれているプロジェクトから「プライマリ出力」を追加します。また、プロパティでカスタム アクションにディレクトリを渡す必要があります。最初の変数名はコードと一致する必要があります。このような:/targetdir="[TARGETDIR]\"
[RunInstaller(true)]
public partial class SetPermissions : Installer
{
private const string STR_targetdir = "targetdir";
private const string STR_aspnetUser = "ASPNET";
public SetPermissions()
{
InitializeComponent();
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
Context.LogMessage(
Context.Parameters
.Cast<DictionaryEntry>()
.Select(entry => String.Format("String = {0} Value = {1}", entry.Key, entry.Value))
.Aggregate(new StringBuilder("From install\n"), (accumulator, next) => accumulator.AppendLine(next))
.ToString()
);
string targetDir = Context.Parameters[STR_targetdir];
string dbDir = Path.Combine(targetDir, "db");
AddFullControlPermissionToDir(dbDir, STR_aspnetUser);
string rimdbSqliteFilename = Path.Combine(dbDir, "db.sqlite");
AddFullControlPermissionToFile(rimdbSqliteFilename, STR_aspnetUser);
string logsDir = Path.Combine(targetDir, "logs");
AddFullControlPermissionToDir(logsDir, STR_aspnetUser);
}
private static void AddFullControlPermissionToDir(string dir, string user)
{
DirectorySecurity directorySecurity = Directory.GetAccessControl(dir);
directorySecurity.AddAccessRule(
new FileSystemAccessRule(
user,
FileSystemRights.FullControl,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow));
Directory.SetAccessControl(dir, directorySecurity);
}
private static void AddFullControlPermissionToFile(string filename, string user)
{
FileSecurity fileSecurity = File.GetAccessControl(filename);
fileSecurity.AddAccessRule(
new FileSystemAccessRule(
user,
FileSystemRights.FullControl,
AccessControlType.Allow));
File.SetAccessControl(filename, fileSecurity);
}
}
于 2010-10-27T22:52:26.253 に答える