我们正在尝试使用 PerfMon 中的数据收集器集(在 Windows Server 2008R2 系统上)将一些数据记录到 CSV 文件中。
我们遇到的问题是我们(似乎)无法控制由 perfmon 创建的日志文件上设置的权限。
我们希望 perfmon 创建的日志文件具有 Everyone:F 权限(每个人的完全控制权)。因此,我们设置了一个目录结构,所有日志都放入一个文件夹中:
c:\vms\PerfMonLogs\%MACHINENAME% (例如 c:\vms\PerfMonLogs\EvaluationG2)
在上面的例子中,c:\vms\PerfMonLogs\EvaluationG2 具有权限 Everyone:F(下面是此目录的 icacls)
EVALUATIONG2/ 所有人:(OI)(CI)(F) NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) BUILTIN\Performance Log Users:(OI)(R)
当数据收集器集运行时,它会在 c:\vms\PerfMonLogs\EvaluationG2 中创建新的子文件夹和文件,例如(C:\vms\PerfMonLogs\EVALUATIONG2\M11d26y2012N3)
每个目录和文件均具有以下权限:
M11d26y2012N3 NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) BUILTIN\Performance Log Users:(OI)(R)
因此这些新文件夹并不是简单地从父文件夹继承权限(不知道为什么)。
现在,我们尝试使用收集器集上的安全选项卡添加 Everyone:F(无骰子)。
有什么想法吗?我们如何控制 perfmon 数据收集器集生成的日志文件的权限?
答案1
数据收集器集可能包含有关计算机的敏感信息,因此访问它们通常要求用户至少是性能日志用户组的成员。我不相信您可以像您所说的那样制作具有自动修改权限(Everyone FullControl)的 DCS。
这是一个怎样的解决方法:
将此 PS 脚本作为计划任务运行:
$Path = "C:\PerfLogs\Admin\New Data Collector Set"
$ACL = (Get-Item $Path).GetAccessControl("Access")
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$ACL.AddAccessRule($ACE)
ForEach($_ In Get-ChildItem $Path -Recurse)
{
Set-Acl -ACLObject $ACL $_.FullName
}
我在装有 PS 2.0(与 2008R2 相同)的 Windows 7 上对此进行了测试,并确认它确实在 $Path 变量中定义的目录下的每个对象上递归地放置了“Everyone Full Control”ACE。
编辑:起初我想使用 DCS 的属性页中的任务选项卡,“当数据收集器集停止时运行此计划任务”,但这不是针对计划任务,而是 WMI 任务。
编辑 #2:好吧,这变得相当疯狂,但您可以创建一个新的计划任务,其触发器将启动“事件发生时”。然后单击“自定义”,再单击“新事件过滤器”。然后手动编辑 XML 过滤器:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">
*[System[TimeCreated[timediff(@SystemTime) <= 3600000]]]
and
*[System[(EventID='102')]]
and
*[EventData[Data and (Data='YOUR DATA COLLECTOR SET NAME')]]
</Select>
</Query>
</QueryList>
现在,您将创建一个计划任务,该任务将在您的数据收集器集完成运行时触发,并且它将递归地将目录结构的 ACL 修改为“每个人完全控制”。