TLDR;动态创建DSC配置文件的最佳方法是什么?
我的任务是维护包含权限的复杂文件夹结构。目前,这是使用自定义PowerShell模块完成的。当对文件夹结构本身进行更改时会出现问题。
使用DSC将消除问题的合规性方面。手动生成20k文件夹的DSC配置绝对是不可能的。我想通过PowerShell从一些输入创建DSC配置。这样,可以及时引入更改,并在DSC配置审核后应用。
或者我完全走错了轨道,我可以在DSC配置中从输入生成结构吗?
答案 0 :(得分:2)
它并不漂亮,但我对 NTFS 权限做了如下操作,如果您没有设置子文件夹访问权限等,您可能需要进行扩展。我没有看到动态创建配置的简单方法,因此我重新调整了用途不同的参数设置。显然这是 5 年后,所以你可能已经想出了一些东西。顶部的开关基本上是替换节点定义文件中的变量。
Function NtfsPermissions
{
Param (
[Parameter(Mandatory=$true)]
[ValidateSet("Present","Absent")]
[string]$Ensure,
[Parameter(Mandatory=$true)]
[string]$Account,
[Parameter(Mandatory=$true)]
[string]$Path,
[string[]]$FileSystemRights,
[string]$Inheritance,
[string]$Depends
)
#Switches are used to dynamically replace accounts and paths that can't be set in nodedefinition file
switch ($Account)
{
"SQLAGENT"
{
$Account = $Node.gSqlAgt
break
}
"SQLSVC"
{
$Account = $Node.gSqlSvc
break
}
"SQLIS"
{
$Account = $Node.gSqlIs
break
}
}
switch ($Path)
{
"AuditPath"
{
$Path = $Node.AuditPath
break
}
"LogDir"
{
$Path = $Node.LogDir
break
}
"DataDir"
{
$Path = $Node.DataDir
break
}
"TempdbDir"
{
$Path = $Node.TempdbDir
break
}
}
if ($Ensure -ne "Absent")
{
cNtfsPermissionEntry $($Account + $Path.Replace(':','_'))
{
Ensure = $Ensure
Path = $Path
Principal = $Account
AccessControlInformation = @(
cNtfsAccessControlInformation
{
AccessControlType = 'Allow'
FileSystemRights = $FileSystemRights
Inheritance = $Inheritance
NoPropagateInherit = $false
}
)
DependsOn = $("[File]$Depends")
}
}
else
{
cNtfsPermissionEntry $($Account + $Path.Replace(':','_'))
{
Ensure = $Ensure
Path = $Path
Principal = $Account
#Need depends on, just not sure how to structure yet
DependsOn = "[File]" + $Depends
}
}
}
$NtfsEntries = $ConfigurationData.NonNodeData.Roles.($Node.Role[0]).NtfsPerms #Need to find a better approach to reference Role
foreach ($ntfs in $NtfsEntries) {
NtfsPermissions -Ensure $ntfs[0] -Account $ntfs[1] -Path $ntfs[2] -FileSystemRights $ntfs[3] -Inheritance $ntfs[4] -Depends $ntfs[5]
}
答案 1 :(得分:1)
编写DSC配置时,它是一个在设计时执行的脚本,最终生成MOF文件。所以你可以这样做:
Configuration Folders {
Get-Content 'myfolderlist.txt' | ForEach-Object {
File $($_ -replace '\\','_')
{
DestinationPath = $_
Ensure = "Present"
}
}
}
这不涉及权限,但它显示了如何在DSC配置中使用循环。这里要记住的重要一点是,它将做的是在设计时生成一个具有20k File
资源的静态配置(MOF)文件。当DSC运行时,循环不会运行(也不存在)。
DSC并不是最快的事情。对20,000个资源进行测试/设置可能非常缓慢且资源密集。我觉得这可能不是这项工作的工具。
或者,您可以创建一个自定义DSC资源,该资源执行测试和设置文件夹结构和权限的所有逻辑,因此它在一个资源中发生。
基本上这是一个美化的计划任务,但这可能没问题,特别是如果你想在更广泛的意义上使用DSC。如果你想看看那些有关如何创建自定义资源的文章(和书籍)很多。