C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/04/13 19:57
IIS6.0では、ワーカープロセスのアカウントとして Network Service アカウントが使用されます。
このアカウントはファイル・ディレクトリへのアクセス権などが制限されていて、ログファイルを出力することすらできません。

これを解決するには、対象のファイル・ディレクトリへ適切な権限を付加する必要があります。
インストーラで、この権限付加の処理を行いたい場合、インストーラのカスタム動作でこれを行います。

以下に例を示します。

//using System;
//using System.Configuration.Install;
//using System.IO;
//using System.Security.AccessControl;

[RunInstaller(true)]
public partial class CustomInstaller : Installer
{
    public CustomInstaller()
    {
        InitializeComponent();
    }

    public override void Install(System.Collections.IDictionary stateSaver)
    {
        string assemblyPathName = this.Context.Parameters["assemblypath"];
        int fileDivisionIndex = assemblyPathName.LastIndexOf('\\');
        string installDirectoryPathName = assemblyPathName.Remove(fileDivisionIndex);
        DirectoryInfo installDirectoryInfo = new DirectoryInfo(installDirectoryPathName);
        // インストール先ディレクトリの ACL ( アクセス制御リスト ) を取得
        DirectorySecurity installDirectoryACL = installDirectoryInfo.GetAccessControl();
        // Network Service アカウントの書き込み権限を表すオブジェクトを生成
        FileSystemAccessRule writingAuthorityOfWorkerProcess = new FileSystemAccessRule("NT AUTHORITY\\NETWORK SERVICE", FileSystemRights.Write, AccessControlType.Allow);
        // ACL に、Network Service アカウントの書き込み権限を追加する
        installDirectoryACL.AddAccessRule(writingAuthorityOfWorkerProcess);
        // インストール先ディレクトリの ACL を設定
        installDirectoryInfo.SetAccessControl(installDirectoryACL);

        base.Install(stateSaver);
    }
}

この例では、インストール先ディレクトリに対して、Network Serviceアカウントが書き込みを行うための権限を付加しています。
これにより、Web アプリがインストール先ディレクトリ内にログファイルを出力することが可能となります。



インストーラ、カスタム動作自体の説明はここでは省略します。これについては以下のチュートリアルを参考にしてください。
Windows インストーラでの配置に関するチュートリアル
スポンサーサイト



2006/08/01 00:28
System.Diagnostics.Traceは、TRACEシンボルが定義されている場合のみ使用できる。Windowsアプリケーションプロジェクトやクラスライブラリプロジェクトの場合、コンパイル時にTRACEシンボルを定義するようデフォルトで設定されている。しかし、ASP.NETの場合、TRACEシンボルはデフォルトで定義されない。ASP.NETでSystem.Diagnostics.Traceを使用したい場合は、コンパイル時にTRACEシンボルを定義するよう、以下の記述をWeb.Configのconfigurationセクションに追加してやる必要がある。

<!-- Web.Configのconfigurationセクションに記述 -->
<system.codedom>
    <compilers>
        <compiler
         language="c#;cs;csharp"
         extension=".cs"
         compilerOptions="/define:TRACE"
         type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
         warningLevel="1"/>
    </compilers>
</system.codedom>


このように、compilerセクションのcompilerOptions属性にTRACEシンボルを定義するようにコンパイルオプションを指定する。language属性,extension属性,type属性は省略できない。
これで、ASP.NETでSystem.Diagnostics.Traceを使用できるようになる。


// 追記 ( 2007/03/22 )
ちなみに、最適化オプション ( "/optimize+" ) は指定しなくても最適化されるから問題なし^^;
タグ: C# .NET ASP.NET Trace ログ