IIS 日志文件夹权限未被继承

IIS 日志文件夹权限未被继承

我们在网络服务器上设置了一个日志文件夹,并为特定 AD 组设置了读取该文件夹的权限(需要查看错误报告但没有该框的管理员权限的开发人员)。

对于已存在的日志,此方法可行,但每当 IIS 创建新的子文件夹(名称模式为“W3SVCx”)时,父文件夹的权限不会向下继承。相反,这些文件夹仅对管理员可见。

我们如何才能让 IIS 使用正确的继承权限写入这些日志,而不会将管理员访问权限授予不应该拥有该权限的用户?

答案1

IIS 在首次向新建站点发出请求后创建 W3SVCx 文件夹,同时还会设置该文件夹的 NTFS 权限,而不管父文件夹的权限及其继承设置如何。它设置的权限包括:

NT AUTHORITY\SYSTEM:(OI)(CI)(F)
BUILTIN\Administrators:(OI)(CI)(F)

我不知道有什么方法可以告诉 IIS 不要这样做。您需要记住,在设置新站点后,点击一次,然后设置日志文件夹的权限。

如果你设置了多个站点,请使用脚本。我使用 PowerShell:

New-WebSite -Name "peter.superuser.com" -port 80 -id 106 -PhysicalPath "C:\inetpub\peter.superuser.com" -HostHeader peter.superuser.com
(New-Object System.Net.WebClient).DownloadString("http://peter.superuser.com")
start-sleep -seconds 1
& icacls.exe "C:\inetpub\logs\LogFiles\W3SVC106" /Q /grant "BUILTIN\Users:`(OI`)`(CI`)`(RX`)"

我首先创建网站,然后点击主页,等待一秒钟,然后设置日志文件夹的权限。

如果你事先不知道网站的 ID,请使用

$newId = (get-childitem IIS:\Sites | where{$_.Name -eq "peter.superuser.com"}).Id
& icacls.exe "C:\inetpub\logs\LogFiles\W3SVC$newId" /Q /grant "BUILTIN\Users:`(OI`)`(CI`)`(RX`)"

创建网站后获取 Id。

要使用此功能,您需要根据您的操作系统启用 IIS 脚本。

答案2

我在任何新的 IIS 7/8 安装上都使用以下解决方法:

  1. 设置文件夹所需的权限C:\inetpub\logs\LogFiles

  2. 修改现有日志文件夹以继承权限

    icacls C:\inetpub\logs\LogFiles\W3SVC* /inheritance:e
    
  3. 预填充前 99 个日志文件夹W3SVC1...W3SVC99以便它们在 IIS 尝试创建其中一个文件夹之前继承权限。当日志文件夹已存在时,IIS 不会修改权限。

    REM cmd style
    for /l %%G in (1,1,99) do md C:\inetpub\logs\LogFiles\W3SVC%%G
    
    # PowerShell style
    1..3 | % { md C:\inetpub\logs\LogFiles\W3SVC$_ }   
    

它并不漂亮,但是却能完成工作。

答案3

我使用 Powershell 创建了我的网站,因此我添加了以下内容以根据网站 ID 创建精确的文件夹。能够在 IIS 之前创建文件夹意味着您可以控制权限。

Import-Module WebAdministration
$iisAppName = "MySite"
$site = Get-ItemProperty IIS:\Sites\$iisAppName
$folderName = "W3SVC" + $site.id    #Create a folder based on the actual site id
$iisLogPath = "C:\MyLogFolder"
$folderPath = Join-Path $iisLogPath $folderName
New-Item -Path $folderPath -ItemType directory

相关内容