適用於:Windows PowerShell 4.0、Windows PowerShell 5.0
這很重要
提取伺服器 (Windows 功能 DSC 服務) 是 Windows Server 支援的元件,但沒有提供新功能或功能的計劃。 我們希望您知道,較新版本的 DSC 現已正式推出,由名為 來賓設定的 Azure 原則功能管理。 來賓設定服務結合了 DSC 延伸模組、Azure 自動化狀態設定的功能,以及客戶意見反應中最常要求的功能。 來賓設定也包括透過 已啟用 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'
}
}
}
放置組態和資源
儲存您想要用戶端節點提取到 SMB 共用資料夾中的任何組態 MOF 檔案和/或 DSC 資源。
任何組態 MOF 檔案都必須命名 <ConfigurationID>.mof,其中 <ConfigurationID> 是目標節點 LCM 的 ConfigurationID 屬性值。 如需設定提取用戶端的相關資訊,請參閱 使用組態 ID 設定提取用戶端。
備註
如果您使用 SMB 提取伺服器,則必須使用組態 ID。 SMB 不支援組態名稱。
每個資源模組都需要按照以下模式 {Module Name}_{Module Version}.zip進行壓縮和命名。 例如,模組版本為 3.1.2.0 的名為 xWebAdminstration 的模組將命名 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 共用提取組態和/或資源的用戶端,您可以使用 ConfigurationRepositoryShare 和 ResourceRepositoryShare 區塊來設定用戶端的本機組態管理員 (LCM),以指定要從中提取組態和 DSC 資源的共用。
如需設定 LCM 的詳細資訊,請參閱 使用組態 ID 設定提取用戶端。
備註
為了簡單起見,此範例使用 PSDscAllowPlainTextPassword 來允許將純文字密碼傳遞至 Credential 參數。 如需更安全地傳遞認證的資訊,請參閱 組態資料中的認證選項。 您必須在 SMB 提取伺服器的中繼組態的 [設定] 區塊中指定 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。