使用 C# 远程设置 IIS AppPool 用户的文件权限
Remotely set file permission to IIS AppPool user with C#
到目前为止,所有关于此的谷歌搜索都在谈论域用户,或者 运行在本地机器上进行进程,这两者都不适合我。
我正在 运行ning 我们的 build/deployment 服务器(一个 Cake 构建脚本 运行ning 在 Team City 上,或者在我本地的机器上)部署一个 wep 应用程序到远程服务器上的 IIS。作为其中的一部分,我需要设置它部署到的目录的权限,以便 IIS 可以看到和 运行 应用程序。我的问题是创建的虚拟帐户 (IIS AppPool\MyAppPool
) 无法从 Team City 服务器看到,因此我无法设置权限。我得到一个例外:
System.Security.Principal.IdentityNotMappedException: Some or all identity references could not be translated.
那么,有什么方法可以从 Team City 服务器或我的本地计算机设置 Web 服务器上文件夹的文件权限,以允许通过虚拟 IIS AppPool 帐户进行访问? (因为我使用的是 Cake Build,任何 C# 解决方案都是理想的,但如果绝对必要,我可以启动其他进程)
根据对问题的一些评论,我想出了这个作为我的最终解决方案:
function Add-RemoteAcl
(
[string]$computerName,
[string]$directory,
[string]$user,
[string]$permission
)
{
$session = New-PSSession -ComputerName $computerName;
Invoke-Command -Session $session -Args $directory, $user, $permission -ScriptBlock {
param([string]$directory,[string]$user,[string]$permission)
$acl = Get-Acl $directory;
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($user, $permission, "ContainerInherit, ObjectInherit", "None", "Allow");
if ($accessRule -eq $null){
Throw "Unable to create the Access Rule giving $permission permission to $user on $directory";
}
$acl.AddAccessRule($accessRule)
Set-Acl -aclobject $acl $directory
};
Remove-PSSession $session;
}
到目前为止,所有关于此的谷歌搜索都在谈论域用户,或者 运行在本地机器上进行进程,这两者都不适合我。
我正在 运行ning 我们的 build/deployment 服务器(一个 Cake 构建脚本 运行ning 在 Team City 上,或者在我本地的机器上)部署一个 wep 应用程序到远程服务器上的 IIS。作为其中的一部分,我需要设置它部署到的目录的权限,以便 IIS 可以看到和 运行 应用程序。我的问题是创建的虚拟帐户 (IIS AppPool\MyAppPool
) 无法从 Team City 服务器看到,因此我无法设置权限。我得到一个例外:
System.Security.Principal.IdentityNotMappedException: Some or all identity references could not be translated.
那么,有什么方法可以从 Team City 服务器或我的本地计算机设置 Web 服务器上文件夹的文件权限,以允许通过虚拟 IIS AppPool 帐户进行访问? (因为我使用的是 Cake Build,任何 C# 解决方案都是理想的,但如果绝对必要,我可以启动其他进程)
根据对问题的一些评论,我想出了这个作为我的最终解决方案:
function Add-RemoteAcl
(
[string]$computerName,
[string]$directory,
[string]$user,
[string]$permission
)
{
$session = New-PSSession -ComputerName $computerName;
Invoke-Command -Session $session -Args $directory, $user, $permission -ScriptBlock {
param([string]$directory,[string]$user,[string]$permission)
$acl = Get-Acl $directory;
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($user, $permission, "ContainerInherit, ObjectInherit", "None", "Allow");
if ($accessRule -eq $null){
Throw "Unable to create the Access Rule giving $permission permission to $user on $directory";
}
$acl.AddAccessRule($accessRule)
Set-Acl -aclobject $acl $directory
};
Remove-PSSession $session;
}