设置 DSC SMB 请求服务器

适用于:Windows PowerShell 4.0 和 Windows PowerShell 5.0

重要

请求服务器(Windows 功能 DSC-Service)是 Windows Server 的一个受支持组件,不过目前没有提供新功能的计划。 我们希望你了解较新版本的 DSC 现已正式发布,它由Azure Policy命名来宾配置的功能管理。 来宾配置服务结合了 DSC 扩展、Azure Automation State Configuration 以及客户反馈中最常请求的功能。 来宾配置还包括通过启用了 Arc 的服务器提供的混合计算机支持。

DSC SMB 请求服务器是计算机托管 SMB 文件共享,可在目标节点提出请求时向它们提供 DSC 配置文件和 DSC 资源。

若要将 SMB 请求服务器用于 DSC,必须执行以下操作:

  • 在运行 PowerShell 4.0 或更高版本的服务器上设置一个 SMB 文件共享
  • 配置运行 PowerShell 4.0 或更高版本的客户端以从该 SMB 共享进行请求

使用 xSmbShare 资源创建 SMB 文件共享

可通过多种方法来设置 SMB 文件共享,不过我们来了解一下如何使用 DSC 来实现此目标。

安装 xSmbShare 资源

调用 Install-Module cmdlet 以安装 xSmbShare 模块。

注意

Install-Module 包含在 PowerShellGet 模块中,后者纳入 PowerShell 5.0。 xSmbShare 包含 DSC 资源 xSmbShare,后者可用于创建 SMB 文件共享。

创建目录和文件共享

下面的配置使用 File 资源创建共享目录,并使用 xSmbShare 资源创建 SMB 共享:

Configuration SmbShare
{
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xSmbShare

    Node localhost
    {

        File CreateFolder
        {
            DestinationPath = 'C:\DscSmbShare'
            Type = 'Directory'
            Ensure = 'Present'
        }

        xSMBShare CreateShare
        {
            Name = 'DscSmbShare'
            Path = 'C:\DscSmbShare'
            FullAccess = 'administrator'
            ReadAccess = 'myDomain\Contoso-Server$'
            FolderEnumerationMode = 'AccessBased'
            Ensure = 'Present'
            DependsOn = '[File]CreateFolder'
        }
    }
}

该配置会创建目录 C:\DscSmbShare(如果尚未存在),随后将该目录用作 SMB 文件共享。 应将 FullAccess 授予给任何需要对文件共享进行写入或删除的帐户。 必须将 ReadAccess 授予给任何从共享获取配置和/或 DSC 资源的客户端节点。

注意

DSC 在默认情况下作为系统帐户进行运行,因此计算机本身必须有权访问共享。

向请求客户端授予文件系统访问权限

向某个客户端节点授予 ReadAccess 可允许该节点访问 SMB 共享,但不可访问该共享中的文件或文件夹。 必须向客户端节点明确授予对 SMB 共享文件夹和子文件夹的访问权限。 我们可以使用 CNtfsAccessControl 模块中包含的 cNtfsPermissionEntry 资源进行添加,对 DSC 执行此操作。 下面的配置添加一个 cNtfsPermissionEntry 块,该块向请求客户端授予 ReadAndExecute 访问权限:

Configuration DSCSMB
{
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xSmbShare
    Import-DscResource -ModuleName cNtfsAccessControl

    Node localhost
    {

        File CreateFolder
        {
            DestinationPath = 'C:\DscSmbShare'
            Type = 'Directory'
            Ensure = 'Present'
        }

        xSMBShare CreateShare
        {
            Name = 'DscSmbShare'
            Path = 'C:\DscSmbShare'
            FullAccess = 'administrator'
            ReadAccess = 'myDomain\Contoso-Server$'
            FolderEnumerationMode = 'AccessBased'
            Ensure = 'Present'
            DependsOn = '[File]CreateFolder'
        }

        cNtfsPermissionEntry PermissionSet1
        {
            Ensure = 'Present'
            Path = 'C:\DscSmbShare'
            Principal = 'myDomain\Contoso-Server$'
            AccessControlInformation = @(
                cNtfsAccessControlInformation
                {
                    AccessControlType = 'Allow'
                    FileSystemRights = 'ReadAndExecute'
                    Inheritance = 'ThisFolderSubfoldersAndFiles'
                    NoPropagateInherit = $false
                }
            )
            DependsOn = '[File]CreateFolder'
        }
    }
}

放置配置和资源

将希望客户端节点请求的所有配置 MOF 文件和/或 DSC 资源保存在 SMB 共享文件夹中。

任何配置 MOF 文件都必须命名 <ConfigurationID>.mof为 ,其中 <ConfigurationID> 是目标节点 LCM 的 ConfigurationID 属性的值。 若要详细了解如何设置请求客户端,请参阅使用配置 ID 设置请求客户端

注意

如果你使用的是 SMB 请求服务器,则必须使用配置 ID。 SMB 不支持配置名称。

每个资源模块都需要进行压缩并按照 {Module Name}_{Module Version}.zip 模式进行命名。 例如,一个名为 xWebAdminstration 并且模块版本为 3.1.2.0 的模块会命名为 xWebAdministration_3.2.1.0.zip。 每个版本的模块都必须包含在单个 zip 文件中。 不支持 zip 文件中存在不同版本的模块。 在打包 DSC 资源模块以供请求服务器使用之前,必须对目录结构稍作更改。

包含 WMF 5.0 中 DSC 资源的模块的默认格式为 {Module Folder}\{Module Version}\DscResources\{DSC Resource Folder}\

为请求服务器打包前,只需删除 {Module version} 文件夹,以使路径变为 {Module Folder}\DscResources\{DSC Resource Folder}\。 进行此更改之后,按上文所述压缩文件夹,并将这些 zip 文件置于 SMB 共享文件夹中。

创建 MOF 校验和

配置 MOF 文件需要与校验和文件配对,以使目标节点上的 LCM 可以验证配置。 若要创建校验和,请调用 New-DSCCheckSum cmdlet。 该 cmdlet 将采用 Path 参数,指定配置 MOF 所在的文件夹。 该 cmdlet 将创建名为 ConfigurationMOFName.mof.checksum 的校验和文件,其中 ConfigurationMOFName 是配置 mof 文件的名称。 如果指定文件夹中存在多个配置 MOF 文件,则将为该文件夹中的每个配置分别创建校验和。

校验和文件与配置 MOF 文件必须位于同一目录中(默认为 $env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration)且具有相同名称(校验文件附加有 .checksum 扩展名)。

注意

如果以任何方式更改配置 MOF 文件,则还必须重新创建校验和文件。

设置 SMB 请求客户端

若要设置从 SMB 共享请求获取配置和/或资源的客户端,可使用指定从哪个共享中请求获取配置和 DSC 资源的 ConfigurationRepositoryShareResourceRepositoryShare 代码块,配置客户端的本地配置管理器 (LCM)。

有关配置 LCM 的详细信息,请参阅使用配置 ID 设置请求客户端

注意

为简单起见,此示例使用 PSDscAllowPlainTextPassword,以允许将明文密码传递到 Credential 参数。 有关更安全传递凭据的信息,请参阅配置数据中的凭据选项。 即使仅请求资源,也必须在 SMB 请求服务器的 metaconfiguration“设置”块中指定“ConfigurationID”

$secpasswd = ConvertTo-SecureString "Pass1Word" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("TestUser", $secpasswd)

[DSCLocalConfigurationManager()]
configuration SmbCredTest
{
    Node $AllNodes.NodeName
    {
        Settings
        {
            RefreshMode = 'Pull'
            RefreshFrequencyMins = 30
            RebootNodeIfNeeded = $true
            ConfigurationID    = '16db7357-9083-4806-a80c-ebbaf4acd6c1'
        }

         ConfigurationRepositoryShare SmbConfigShare
        {
            SourcePath = '\\WIN-E0TRU6U11B1\DscSmbShare'
            Credential = $mycreds
        }

        ResourceRepositoryShare SmbResourceShare
        {
            SourcePath = '\\WIN-E0TRU6U11B1\DscSmbShare'
            Credential = $mycreds

        }
    }
}

$ConfigurationData = @{
    AllNodes = @(
        @{
            #the "*" means "all nodes named in ConfigData" so we don't have to repeat ourselves
            NodeName="localhost"
            PSDscAllowPlainTextPassword = $true
        })
}

致谢

特别感谢以下人员:

  • Mike F. Robbins,其有关将 SMB 用于 DSC 的文章帮助告知本主题中的内容。 其博客地址是 Mike F Robbins
  • Serge Nikalaichyk,他是 cNtfsAccessControl 模块的作者。 此模块的来源位于 cNtfsAccessControl

另请参阅

Windows PowerShell Desired State Configuration 概述

执行配置

使用配置 ID 设置请求客户端