当无法创建或删除资源对象时,自定义DSC资源应如何运作?

时间:2016-12-02 14:43:05

标签: powershell dsc

当DSC无法创建或删除实际资源对象时,自定义DSC资源应如何运作?

在我的具体示例中,我正在编写用于管理COM +应用程序,组件和Interfaces的资源。为应用程序和组件创建资源很好;可以通过编程方式从Catalog中创建和删除它们。但是,从DLL创建组件时会自动创建接口。

我需要能够更新接口属性(即QueuingEnabled属性)。因此,我打算如下所述描述COM +接口的配置:

COMplusInterface MyInterface
{
    Ensure = 'Present'
    ApplicationID = 'BB5B8A1F-D70C-44BD-8ADD-E548DF39AACF'
    ComponentDLLPath = 'C:\Program Files\MyApplication\bin\MyComponent.dll'
    InterfaceName = 'MyInterface'
    Description = 'This is my interface'
    QueuingEnabled = $true
}

但是如果应用程序或组件尚不存在,该资源是否应该抛出错误?同样,如果DLL只是没有那个接口。 Test-TargetResource返回$false是没有意义的,因为这将启动Set-TargetResource,然后无法创建界面。

接下来,如果Ensure设置为Absent,DSC资源应该做什么?如果它存在,则无法删除接口,只有删除组件才能执行此操作。我应该只将所有接口属性恢复为默认值吗?

1 个答案:

答案 0 :(得分:1)

从您关于Ensure的问题开始,我只是说没有任何要求拥有Ensure财产的要求。虽然大多数资源都有,但你会发现它们(甚至来自微软)并不是很有意义。如果它对您的资源没有意义,请不要包含它。

至于如果组件不存在该怎么办,是的,你应该抛出一个错误。在DependsOn资源中使用COMplusInterface,确保在COMplusComponent资源后应用Test-TargetResource

只要状态不匹配,

$false就会返回Set-TargetResource,无论原因是该组件不存在,还是属性不匹配。如果组件不存在,则DependsOn将运行,并且它将失败,因为它应该。您尝试使用配置描述状态,因此您应该在此部分运行之前在配置中设置先决条件状态(即ApplicationID所在的位置)。

我会说Key应该是您的COMplusComponent MyComponent { <# your component resource #> } COMplusInterface MyInterface { ApplicationID = 'BB5B8A1F-D70C-44BD-8ADD-E548DF39AACF' QueuingEnabled = $true DependsOn = '[COMplusComponent]MyComponent' } 属性,其他属性应该是可选的;如果你强迫他们的状态,你只想指定它们,所以我认为你应该能够这样指定你的配置:

<div class="movdb-header"></div> <!-- this is the header i want to display above navbar -->

<div class="navbar navbar-inverse navbar-fixed-top"> 
<div class="container">
    <div class="navbar-header">
        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
        </button>
        @Html.ActionLink("Home", "Index", "Home", new {area = ""}, new {@class = "navbar-brand"})
        @Html.ActionLink("Inloggen", "Index", "User", new {area = ""}, new {@class = "navbar-brand"})
        @Html.ActionLink("Uitloggen", "Index", "Logout", new {area = ""}, new {@class = "navbar-brand"})
    </div>
    <div class="navbar-collapse collapse">
        <ul class="nav navbar-nav">
        </ul>
    </div>
</div>