动态创建DSC配置

时间:2016-08-26 15:08:12

标签: powershell ntfs dsc

TLDR;动态创建DSC配置文件的最佳方法是什么?

我的任务是维护包含权限的复杂文件夹结构。目前,这是使用自定义PowerShell模块完成的。当对文件夹结构本身进行更改时会出现问题。

使用DSC将消除问题的合规性方面。手动生成20k文件夹的DSC配置绝对是不可能的。我想通过PowerShell从一些输入创建DSC配置。这样,可以及时引入更改,并在DSC配置审核后应用。

或者我完全走错了轨道,我可以在DSC配置中从输入生成结构吗?

2 个答案:

答案 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。如果你想看看那些有关如何创建自定义资源的文章(和书籍)很多。