动态地将参数传递给DSC资源?

时间:2016-01-10 08:30:30

标签: powershell dsc

当我遇到能够动态地将参数传递给DSC资源的问题时,我正在研究复合资源,并想知道是否还有另一种方法可以解决这个问题。

基本上,我有一个数组(下面),每个所需的文件共享包含一个PSObject。每个PSObject都具有用作我的DSC资源的参数的属性(在本例中为cLocalFileShare社区资源)。

问题是,并非所有这些对象都定义了所有参数。例如,我的部分广告资源没有分配给ReadAccess权限的任何用户/群组,但在我的ForEach循环(下方)中,正在传递$null值对于实际资源,因为没有定义此权限,这会导致资源在尝试为用户ReadAccess设置$null权限时出错。

我的问题是,我如何解决这个问题 - 对于这个资源和其他人?

  • 我已尝试在DSC资源中展示参数,但似乎并未支持此功能。如果这样做,我可以构建一个不同的参数列表并传递它。
  • 有人在Reddit上建议传递一个包含所有参数的字符串,但这似乎并不支持。
  • 我最担心的是,我必须编辑每个资源以支持(并最终忽略)$ null值,这似乎是解决此问题的一种非常糟糕的方法。

所以,这里的数组包含每个文件共享的PSObject。

$MyConfig = @(
    @{ 
        Path = 'D:\Shares\Accounting'
        Name = 'Accounting'
        Ensure = 'Present'
        ChangeAccess = 'AccountingAdmins'
        ReadAccess = 'AccountingInterns,FinanceDepartment'
    } 
    @{ 
        Path = 'D:\Shares\Software'
        Name = 'Software$'
        Ensure = 'Present'
        ReadAccess = 'DomainUsers'
    }
)

现在,在实际的DSC配置中......

configuration {
    ForEach ($ShareProperties in $MyConfig) {
        # Each resource is named after the Path specified, but with the colon replaced as that's not valid character for the resource name
        cLocalFileShare $ShareProperties.Path.Replace(':','__') {
            Path = $ShareProperties.Path
            Name = $ShareProperties.Name
            Ensure = $ShareProperties.Ensure
            ChangeAccess = $ShareProperties.ChangeAccess
            ReadAccess = $ShareProperties.ReadAccess
        }
    }
}

1 个答案:

答案 0 :(得分:0)

不是最优雅的解决方案。但是你可以在ForEach循环中使用条件部分。

{{1}}