我可以在powershell脚本中使用Resource.Schema.Mof文件中的数据吗?

我可以在powershell脚本中使用Resource.Schema.Mof文件中的数据吗?,powershell,dry,dsc,Powershell,Dry,Dsc,我正在编写一个DSC资源,用于管理Windows DNS配置项(BootMethod、EventLogLevel等)。MyGet-TargetResource函数需要迭代资源能够管理的所有配置项。目前,我在Resource.psm1文件中有一个哈希表来描述所有这些,但我希望能够使用Resource.Schema.Mof文件中已经存在的描述,这是构建资源的第一步。这是可能的,还是因为我不知道的原因而不明智 Schema.mof: [ClassVersion("1.0.0"), FriendlyNa

我正在编写一个DSC资源,用于管理Windows DNS配置项(BootMethod、EventLogLevel等)。My
Get-TargetResource
函数需要迭代资源能够管理的所有配置项。目前,我在
Resource.psm1
文件中有一个哈希表来描述所有这些,但我希望能够使用
Resource.Schema.Mof
文件中已经存在的描述,这是构建资源的第一步。这是可能的,还是因为我不知道的原因而不明智

Schema.mof:

[ClassVersion("1.0.0"), FriendlyName("GO_DnsServerConfig")]
class GO_DnsServerConfig : OMI_BaseResource
{
[Key] string Name;
[Write,ValueMap{"Present","Absent"},Values{"Present","Absent"}]
string Ensure;
[Write] UInt32 AddressAnswerLimit;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 BindSecondaries;
[Write,ValueMap{"0","1","2","3"},Values{"0","1","2","3"}]
UInt32 BootMethod;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 DefaultAgingState;
[Write] UInt32 DefaultNoRefreshInterval;
[Write] UInt32 DefaultRefreshInterval;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 DisableAutoReverseZones;
[Write,ValueMap{"0","1"},Values{"0","1"}]
UInt32 DisableNsRecordsAutoCreation;
[Write] UInt32 DsPollingInterval;
[Write] UInt32 DsTombstoneInterval;
[Write] UInt32 EDnsCacheTimeout;
/* Does not appear to be fully implemented in dnscmd
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 EnableDnsProbes;
*/
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 EnableDnsSec;
[Write,ValueMap{"0","1"},Values{"0","1"}]
UInt32 EnableGlobalNamesSupport;
[Write,ValueMap{"0","1"},Values{"0","1"}]
UInt32 EnableGlobalQueryBlocklist;
[Write,ValueMap{"0","1","2","4"},Values{"0","1","2","4"}]
UInt32 EventLogLevel;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 ForwardDelegations;
[Write] UInt32 ForwardingTimeout;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 GlobalNamesQueryOrder;
/*
[Read,ValueMap{"isatap","wpad"},Values{"isatap","wpad"}]
String GlobalQueryBlocklist;
*/
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 IsSlave;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 LocalNetPriority;
[Write] UInt32 LogFileMaxSize;
[Write] string LogFilePath;
[Write] string LogIpFilterList;
[Write] uint32 LogLevel;
[Write] uint64 MaxCacheSize;
[Write]
uint32 MaxCacheTtl;
[Write,ValueMap{"0","1","2","3"},Values{"0","1","2","3"}]
uint16 NameCheckFlag;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 NoRecursion;
[Write] uint32 RecursionRetry;
[Write] uint32 RecursionTimeout;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 RoundRobin;
[Write] uint32 RpcProtocol;
[Write] uint32 ScavengingInterval;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 SecureResponses;
[Write] uint32 SendPort;
[Write] string ServerLevelPluginDll;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 StrictFileParsing;
[Write] UInt32 UpdateOptions;
[Write,ValueMap{"0","1"},Values{"0","1"}] UInt32 WriteAuthorityNs;
[Write] uint32 XfrConnectTimeout;
};
获取TargetResource函数:

function Get-TargetResource
{
[CmdletBinding()]
[OutputType([Hashtable])]
param
(
    [Parameter(Mandatory = $true)]
    [string]$Name
)

Set-StrictMode -Version 2.0
$ErrorActionPreference = 'Stop'

$ConfigItems =
@{
    Name                         = $Name;
    Ensure                       = $null;
    AddressAnswerLimit           = $null;
    BindSecondaries              = $null;
    BootMethod                   = $null;
    DefaultAgingState            = $null;
    DefaultNoRefreshInterval     = $null;
    DefaultRefreshInterval       = $null;
    DisableAutoReverseZones      = $null;
    DisableNsRecordsAutoCreation = $null;
    DsPollingInterval            = $null;
    DsTombstoneInterval          = $null;
    EDnsCacheTimeout             = $null;
    #EnableDnsProbes              = $null; #Disabled; see schema.
    EnableDnsSec                 = $null;
    EnableGlobalNamesSupport     = $null;
    EnableGlobalQueryBlocklist   = $null;
    EventLogLevel                = $null;
    ForwardDelegations           = $null;
    ForwardingTimeout            = $null;
    GlobalNamesQueryOrder        = $null;
    GlobalQueryBlocklist         = $null;
    IsSlave                      = $null;
    LocalNetPriority             = $null;
    LogFileMaxSize               = $null;
    LogFilePath                  = $null;
    LogIpFilterList              = $null;
    LogLevel                     = $null;
    MaxCacheSize                 = $null;
    MaxCacheTtl                  = $null;
    NameCheckFlag                = $null;
    NoRecursion                  = $null;
    RecursionRetry               = $null;
    RecursionTimeout             = $null;
    RoundRobin                   = $null;
    RpcProtocol                  = $null;
    ScavengingInterval           = $null;
    SecureResponses              = $null;
    SendPort                     = $null;
    ServerLevelPluginDll         = $null;
    StrictFileParsing            = $null;
    UpdateOptions                = $null;
    WriteAuthorityNs             = $null;
    XfrConnectTimeout            = $null;
}

Write-Verbose "Check to see if there is a DNS server present on the box."
$ConfigItems.Ensure = Get-EnsureValue
If ($ConfigItems.Ensure -eq 'Present')
{
    Write-Verbose "A DNS Server was found on this machine."
    $ConfigItems.Ensure = 'Present'

    Write-Verbose "Create a new hashtable to store the result."
    $result = @{}

    Write-Verbose "Add manually enumerated values to the resultset."
    $result.Add('Name', $ConfigItems.Name)
    $result.Add('Ensure', $ConfigItems.Ensure)

    Write-Verbose "Get the current value for any item that is null."
    $ConfigItems.GetEnumerator() `
    | Where-Object {$_.Value -eq $null} `
    | ForEach-Object `
    {
        $itemName = $_.Name
        Write-Verbose "Getting: '$itemName'"
        $itemValue =
            Get-DnsConfigurationItem -Item $itemName
        Write-Debug "Value: '$itemValue'"

        if ($itemValue -ne $null)
        {
            Write-Verbose "Adding item to resultset."
            $result.Add($itemName, $itemValue)
        }
    }
}
Else
{
    Write-Verbose "No DNS server was found on this machine."
    Write-Verbose "Returning with Ensure = '$($ConfigItems.Ensure)'."
    $result = @{ Name = $ConfigItems.Name; Ensure = $ConfigItems.Ensure }
}

return $result
}

您可以尝试使用PowerShell v5中引入的类编写资源。它应该可以在很大程度上消除您所谈论的问题—例如,没有schema.mof可使用

您可以尝试使用PowerShell v5中引入的类编写资源。它应该可以在很大程度上消除您正在谈论的问题-例如,没有schema.mof可供使用

您可以发布您的模块代码或其片段,以及mof的相关部分吗?谢谢,但我很难找到Resource.schema.mof中已经存在的描述,我看不出你想在代码中的什么地方重用这个值。你能指出你将在哪里重复描述吗,你在哪里;I’我希望定义一次吗?Schema.mof文件中的所有内容都将在$ConfigItems哈希表中进行第二次定义,以便我可以对其进行迭代并获取实际值。我希望能够读取Schema.mof数据来代替哈希表。哦,我想我明白你现在说的了。你考虑过做相反的事吗?根据脚本?生成MOF文件。嗯,这会增加一个构建步骤,我宁愿避免。在.Net中似乎必须有一些函数来解析.Mof文件。我只是不知道它是否是公共的。你能发布你的模块代码,或者它的一个片段,以及MOF的相关部分吗?谢谢,但是我很难找到“Resource.Schema.MOF中已经存在的描述,我不知道你想在代码中的什么地方重复使用该值。你能指出你将在哪里重复描述吗,你在哪里;I’我希望定义一次吗?Schema.mof文件中的所有内容都将在$ConfigItems哈希表中进行第二次定义,以便我可以对其进行迭代并获取实际值。我希望能够读取Schema.mof数据来代替哈希表。哦,我想我明白你现在说的了。你考虑过做相反的事吗?根据脚本?生成MOF文件。嗯,这会增加一个构建步骤,我宁愿避免。在.Net中似乎必须有一些函数来解析.Mof文件。我只是不知道其中是否有公开的。