设置 DSC SMB 拉取服务器

适用于:Windows PowerShell 4.0、Windows PowerShell 5.0

重要

拉取服务器(Windows 功能 DSC 服务)是 Windows Server 受支持的组件,但没有计划提供新特性或功能。 我们希望你知道,较新版本的 DSC 现已正式发布,由名为 “来宾配置”的 Azure Policy 功能管理。 来宾配置服务结合了 DSC 扩展、Azure 自动化状态配置的功能以及客户反馈中最常请求的功能。 来宾配置还包括通过 已启用 Arc 的服务器的混合计算机支持。

DSC SMB 拉取服务器是托管 SMB 文件共享的计算机,当目标节点请求 DSC 配置文件和 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 文件共享。

创建目录和文件共享

以下配置使用 文件 资源创建共享的目录,并使用 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。 必须向从共享获取配置和/或 DSC 资源的任何客户端节点提供 ReadAccess

注释

默认情况下,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'
        }
    }
}

放置配置和资源

保存希望客户端节点在 SMB 共享文件夹中拉取的任何配置 MOF 文件和/或 DSC 资源。

任何配置 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 共享拉取配置和/或资源的客户端,请使用 ConfigurationRepositoryShareResourceRepositoryShare 块配置客户端的本地配置管理器 (LCM),这些块指定要从中拉取配置和 DSC 资源的共享。

有关配置 LCM 的更多信息,请参阅 使用配置 ID 设置拉取客户端

注释

为简单起见,此示例使用 PSDscAllowPlainTextPassword 允许将纯文本密码传递给 Credential 参数。 有关更安全地传递凭据的信息,请参阅 配置数据中的凭据选项必须在 SMB 拉取服务器的元配置的 Settings 块中指定 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 配置概述

制定配置

使用配置 ID 设置拉取客户端