8

ASP.NET アプリケーションがあります。基本的に配信プロセスは次のとおりです。

  • Nant はアプリケーションをビルドし、SVN フォルダーや不要なファイルを除いたアプリケーション ファイルを含む zip ファイルを開発者のコ​​ンピューター上に作成します。このファイルは、Nant スクリプトとともに提供されます。
  • zip ファイルと nant ファイルがクライアントのコンピューターにコピーされます。
  • Nant スクリプトは、現在の Web サイト ファイルを zip ファイルに含まれるファイルに置き換えます。

私の問題は、このプロセスでは、Web サイトを開こうとすると Unauthorized access エラーが発生することです。ファイルには、ユーザー " IIS_WPG "のアクセス許可を設定する必要があるようです。

IIS 構成を変更する権限がないため、各ファイルのアクセス許可を手動で変更する必要があります。また、ファイルを置き換えるたびにアクセス許可が削除されるため、再度設定する必要があります。

だから私は2つの質問があります:

  • Nant でファイルのパーミッションを変更できますか? どうやってするの ?
  • この問題を回避することは可能ですか? (開発者は自分のコンピューターにこのユーザーを持っていません)
4

4 に答える 4

7

@Jeff Fritz Ouch ...あなたの提案は正しい解決策ですが、パラメータは...危険です:)。

開発用コンピューターでは、管理者としてログに記録されており、cmdを使用して提案を試しました。

  • コマンドで定義されたものだけを設定するために設定されたすべてのアクセス許可を置き換えます(したがって、コマンドの後で、ファイルにアクセスすると、管理者ユーザーでも「アクセスが拒否されました」という結果になります)
  • wwwrootフォルダーからコマンドを呼び出しているときに、C:\WINDOWS\ディレクトリに適用されました。:)

したがって、いくつかのテストの後、正しいコマンドは次のとおりです。

cacls [full folder path] /T /E /G IIS_WPG:F
  • / T:指定されたフォルダとサブフォルダに適用されます
  • / E:ACLを置き換えるのではなく編集します:)
于 2008-10-24T13:06:59.390 に答える
4

Windows で CACLS プログラムを実行して、ファイルとフォルダーにアクセス許可を付与する必要があります。Nant から、EXEC タスクでこれを行うことができます。

次のようなタグ ブロックを試してください。

<exec program="cacls">
    <arg value="*" />
    <arg value="/G IIS_WPG:F" />
</exec>
于 2008-10-24T12:27:39.563 に答える
3

このための独自のタスクを、かなり単純なコードで作成することになりました。

[TaskName("addusertodir")]
public class AddUserToDirectorySecurity : Task
{
    [TaskAttribute("dir", Required=true)]
    public string DirPath { get; set; }

    [TaskAttribute("user", Required=true)]
    public string UserName { get; set; }

    protected override void ExecuteTask()
    {
        FileSystemAccessRule theRule1 = new FileSystemAccessRule(UserName, FileSystemRights.ListDirectory, AccessControlType.Allow);
        FileSystemAccessRule theRule2 = new FileSystemAccessRule(UserName, FileSystemRights.ReadAndExecute, AccessControlType.Allow);
        FileSystemAccessRule theRule3 = new FileSystemAccessRule(UserName, FileSystemRights.Read, AccessControlType.Allow);

        DirectorySecurity theDirSecurity = new DirectorySecurity();
        theDirSecurity.AddAccessRule(theRule1);
        theDirSecurity.AddAccessRule(theRule2);
        theDirSecurity.AddAccessRule(theRule3);
        Directory.SetAccessControl(DirPath, theDirSecurity);
    }
}

次に、カスタム タスクをロードして実行する nant スクリプトを記述できます。

<loadtasks>
    <fileset>
        <include name="MyTask.dll"/>
    </fileset>
</loadtasks>

<addusertodir dir="MyDir" user="IIS_WPG"/>

明らかに、これは特定のルールに合わせて変更することも、必要に応じてタスクでこれをパラメーター化することもできます。適用されるパーミッションをより細かく制御できるため、exec タスクを使用するよりもこれを優先しました。

于 2008-10-24T16:49:21.547 に答える
2

CACLS は非推奨になりました。これは、代わりに ICACLS を使用するバージョンです。

以下があるとしましょう:

  • インストールのルート フォルダは「c:\inetpub\wwwroot」で、NANT 変数に格納されています。${paths.myprogram.inetpub}
  • 変更したいフォルダは「uploads」と呼ばれ、そこに保存されています${upload.foldername}
  • アクセスを許可したいユーザーは「IIS_UPLOAD_USER」で、${iis.upload.user}
  • 付与したい権限レベルは「M」で、「変更」権限を表し、${iis.user.permissionlevel}

これらの仮定で、私たちのタスクは次のとおりです。

<exec program="icacls">
    <arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" />
    <arg value="/grant" />
    <arg value="${iis.upload.user}:${iis.user.permissionlevel}" />
</exec>

お役に立てれば!

于 2012-10-22T17:46:43.320 に答える