我们在网络服务器上设置了一个日志文件夹,并为特定 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 安装上都使用以下解决方法:
设置文件夹所需的权限
C:\inetpub\logs\LogFiles
修改现有日志文件夹以继承权限
icacls C:\inetpub\logs\LogFiles\W3SVC* /inheritance:e
预填充前 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