用 DSC 对 Windows 做声明式配置管理 —— 从 dsc.exe 开始的 IaC
· 更新日期: · Go Komura · Windows, DSC, IaC, PowerShell, winget, 配置管理
更新记录(仅首版,2026年08月28日 发布)
- 首次发布
新电脑的安装步骤文档、写着服务器搭建步骤的 Excel、离职者留下的祖传 BAT 文件 —— 直到今天,很多现场的 Windows 配置管理仍然靠“写着步骤的文档”和“执行步骤的脚本”在转。这种做法的弱点很清楚:步骤从执行的那一刻起就开始和现实脱节,而脚本在第二次执行时就会坏掉。
在 Linux 和云上,Terraform、Ansible 这类声明式的 IaC(Infrastructure as Code)早已是常态。那么,要用同样的思路去管理 Windows 客户端和服务器本身,该用什么呢?微软给出的答案是 DSC(Desired State Configuration),而随着 2025 年被重写为不依赖 PowerShell 的命令行工具的 Microsoft DSC v3(dsc.exe) 出现,它终于变成了“可以正常上手”的样子。1
目标读者是那些用步骤文档和脚本管理 Windows 电脑与服务器配置、希望转向声明式管理的开发者和信息化负责人。前提环境是 Windows 10/11 与 DSC 3.0 及以上版本,并以 PowerShell 的基本操作作为背景知识。难度为中级。
1. 先说结论
DSC 里写的不是“要执行的步骤”,而是用 YAML 写“应有的状态”。与当前状态的差异检测(test)和应用(set)由资源承担,所以同一份文件执行多少次都是安全的(幂等),配置也变成了可以在 Git 上评审的数据。现在开始做的话,Microsoft DSC v3(
dsc.exe)是唯一的选择。
步骤脚本和声明式配置的区别,体现在“坏的方式”上。写着步骤的脚本,对中途失败的电脑或已经设置完毕的电脑再跑一次,就会因为重复应用或报错而停下。声明式的配置只写了“应有的状态”,所以无论跑多少次、从什么样的中间状态开始跑,都会收敛到同一个结果。2
flowchart TB
accTitle: 命令式步骤文档与声明式配置的对比
accDescr: 命令式脚本自上而下执行步骤,因此重跑会造成重复应用或中断;而声明式的 DSC 声明应有的状态并只应用差异,所以执行多少次都会收敛到同一个状态
imp["命令式:写步骤(BAT・步骤文档)"] --> i1["自上而下依次执行"]
i1 --> i2["重跑会重复应用・报错"]
dec["声明式:写状态(DSC)"] --> d1["检测与当前状态的差异"]
d1 --> d2["只应用差异・跑多少次都安全"]
图1: 命令式脚本对“执行次数”很敏感,而声明式配置无论执行多少次都会收敛到同一个状态。
图中实线表示始终成立的关系,虚线表示带条件的关系(成立条件写在详情页各关系的说明中)。关系的完整列表(共 17 条,附依据与确信度)以及主要概念的定义,汇总在知识地图详情页(日文)。数据:JSON-LD / Turtle
2. 理清“DSC”这个名字带来的混乱 —— 四个谱系
学习 DSC 时最先绊住人的,不是技术本身,而是搜索结果的混乱。叫“DSC”的机制一共有四个谱系,写法、执行方式和兼容性都不一样。3
| 谱系 | 实体 | 定位 |
|---|---|---|
| PSDSC v1.1 | Windows PowerShell 5.1 内置 | 遗留方案。LCM 常驻・MOF 格式 |
| PSDSC v2 | 面向 PowerShell 7 的模块 | PSDesiredStateConfiguration 2.x |
| PSDSC v3(预览版) | PowerShell 模块 | 面向 Azure Machine Configuration 的 Linux 支持 |
| Microsoft DSC v3 | 独立的 dsc.exe |
本文的主角。不依赖 PowerShell・跨平台 |
Microsoft DSC v3 并不是把此前的 PowerShell DSC(PSDSC)简单更新一版,而是把对 PowerShell 的依赖切掉后重写出来的另一个产品。配置不再是 PowerShell 脚本而是 JSON/YAML 数据,资源可以用任何语言实现,并且在 Linux、macOS、Windows 上表现一致。1
flowchart TB
accTitle: DSC 四个谱系的系谱
accDescr: 从 Windows PowerShell 5.1 内置的 PSDSC v1.1 派生出面向 PowerShell 7 的 PSDSC v2 和面向 Machine Configuration 的 PSDSC v3 预览版,而与它们分开、被重写为不依赖 PowerShell 的 Microsoft DSC v3 成为当前主角的关系
v11["PSDSC v1.1(WinPS 5.1 内置)"] --> v2["PSDSC v2(PowerShell 7)"]
v2 --> v3ps["PSDSC v3 预览版"]
v11 -.->|"重写"| dsc3["Microsoft DSC v3(dsc.exe)"]
v3ps --> mc["Azure Machine Configuration"]
dsc3 --> now["本文的主角"]
图2: 搜索“DSC”时,四个谱系的信息会混在一起出现。先分辨清楚一篇文章或一份资料讲的是哪个谱系,这一点很重要。
以下本文中写到“DSC”,指的都是 Microsoft DSC v3。旧世代的资产不会白费,这一点后面(第 6 节)会讲。
3. 声明式到底是什么意思 —— get・test・set 与幂等性
DSC 的核心概念是资源。资源针对“注册表值”“Windows 功能”“环境变量”这样每一类配置对象,提供状态的获取(Get)、判定(Test)、应用(Set)这几种操作。Get 是所有资源都要实现的。Test 对于没有自带实现的资源,由 DSC 用获取结果与声明的比较(合成测试)来代劳。Set 只有能强制状态的资源才会实现,像操作系统信息这类只读资源就没有。4 使用者把“具体怎么设置”交给资源,自己只用数据写清“什么应该是什么样”。
正是这种分工带来了幂等性。在应用配置文档(dsc config set)时,DSC 会先对每个实例执行 test,只对不处于期望状态的实例调用 set。所以同一份配置应用多少次都是安全的。需要注意的是,单独对资源执行 dsc resource set 时总是会调用 set,是否有事前测试取决于资源自身的实现(implementsPretest),这是二者的差别。5
flowchart TB
accTitle: 由 get・test・set 构成的收敛循环
accDescr: test 把配置文档里写的应有状态与当前状态做比较,没有差异就什么都不做,有差异则由 set 只应用差异,并可以用 get 确认结果,这就是幂等的收敛流程
doc["配置文档(应有的状态)"] --> test["test:与当前状态比较"]
test -->|"无差异"| ok["什么都不做(幂等)"]
test -->|"有差异"| set["set:只应用差异"]
set --> get["get:确认结果状态"]
图3: DSC 的应用是“先比较,再只改必要的部分”的循环,从此不必再纠结执行次数这个概念。
用代码来看它和命令式脚本的区别。比如“往注册表里写入这个值”这件事,在脚本里要自己把存在检查、创建、更新都分别写出来。
# 命令式:写“步骤”。分支和顺序全都要自己管理
$path = 'HKCU:\Software\MyCompany\App'
if (-not (Test-Path $path)) {
New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name 'Mode' -Value 'standard'
在 DSC 里,同一件事写成“应有状态”的声明。没有存在检查,也没有分支。
# 声明式:写“状态”。怎么创建、怎么修正是资源的活
- name: 应用的运行模式
type: Microsoft.Windows/Registry
properties:
keyPath: HKCU\Software\MyCompany\App
valueName: Mode
valueData:
String: standard
4. 装上 dsc.exe,单独调用资源试试
DSC 的安装方式有两种。要么从 GitHub 的 Release 下载压缩包解压后加入 PATH,要么在 Windows 上经由 Microsoft Store 源用 winget 安装。1
# 从 Microsoft Store 源搜索并安装稳定版
winget search DesiredStateConfiguration --source msstore
winget install --id 9NVTPZWRC6KQ --source msstore
装好之后,先列出本机可以使用的资源。
dsc resource list
在写配置文档之前,资源也可以一个一个单独调用。正是这种“可以小步试”的特性,让 v3 学起来轻松了不少。6
# 获取当前的状态(get)
dsc resource get --resource Microsoft.Windows/Registry `
--input '{"keyPath":"HKCU\\Software\\MyCompany\\App","valueName":"Mode"}'
# 判定是否处于期望状态(test) ── 不做任何更改
dsc resource test --resource Microsoft.Windows/Registry `
--input '{"keyPath":"HKCU\\Software\\MyCompany\\App","valueName":"Mode","valueData":{"String":"standard"}}'
flowchart TB
accTitle: dsc resource 命令的四种操作
accDescr: dsc resource 命令之下挂着列出资源的 list、获取当前状态的 get、不做更改只判定是否处于期望状态的 test、以及应用状态的 set(仅限实现了 Set 的资源)这四种操作的结构
cli["dsc resource 命令"] --> l["list:资源一览"]
cli --> g["get:获取当前状态"]
cli --> t["test:只判定・不更改"]
cli --> s["set:应用(支持 Set 的资源)"]
图4: 不写配置文档也能单独调用资源。先只用 get 和 test 从观察开始,是安全的入门路线。
凡是伴随 set 的变更操作,以及处理 HKLM、系统设置的资源,都需要管理员权限。试手时从写入目标在用户名下(比如 HKCU)的例子开始,会比较稳妥。
5. 配置文档 —— 用 YAML 写“应有的状态”
把多个资源集中声明在一起的就是配置文档。它用 YAML 或 JSON 编写,至少要定义 $schema 和 resources 两项。每个资源实例都带有 name(在文档内唯一的显示名)、type(资源的完全限定名)、properties(期望的状态)。2
# standard-pc.dsc.config.yaml ── 标准客户端电脑应有的状态
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
parameters:
appMode:
type: string
defaultValue: standard
resources:
- name: 应用的运行模式
type: Microsoft.Windows/Registry
properties:
keyPath: HKCU\Software\MyCompany\App
valueName: Mode
valueData:
String: "[parameters('appMode')]"
用上 parameters 和 variables,就能在一份文档里表达各环境之间的差异(比如按部门不同的设置值)。表达式的写法是 ARM 模板函数的一个子集。2
flowchart TB
accTitle: 配置文档的结构
accDescr: 配置文档由表示文档架构的 schema、吸收环境差异的 parameters 与 variables、以及资源实例数组 resources 构成,而每个实例都带有 name・type・properties 的结构
docroot["配置文档(YAML / JSON)"] --> sch["$schema:文档架构的 URI"]
docroot --> par["parameters / variables"]
docroot --> res["resources:实例的数组"]
res --> inst["name・type・properties"]
par -.-> inst
图5: 配置文档只是“架构+参数+资源声明”这样朴素的数据,而不是程序。
应用之前一定要先插入一步“观察”。dsc config test 不做任何更改就报告有没有差异,dsc config set --what-if 则显示“执行之后什么会改变”的预测。7
# 1. 确认有没有差异(不做更改)
dsc config test --file .\standard-pc.dsc.config.yaml
# 2. 预测显示应用之后会有什么变化(不做更改)
dsc config set --file .\standard-pc.dsc.config.yaml --what-if
# 3. 认可之后再应用
dsc config set --file .\standard-pc.dsc.config.yaml
# 4. 确认应用之后的状态
dsc config get --file .\standard-pc.dsc.config.yaml
反方向也有入口。dsc config export 会针对用 --file 传入的输入文档中列举的资源(仅限支持 export 的资源),生成一份包含系统上全部实例的配置文档并输出到标准输出。它可以作为把既有环境的现状记录下来的起点。8
# 传入列举了目标资源的输入文档,保存当前现状的配置文档
dsc config export --file .\export-targets.dsc.config.yaml > .\current-state.dsc.config.yaml
flowchart TB
accTitle: 安全应用的四个步骤
accDescr: 先用不做更改的 dsc config test 确认有没有差异,再用 dsc config set 的 what-if 选项预测显示变更内容,认可之后用 set 应用,最后用 get 确认结果的安全顺序
t["dsc config test(有无差异)"] --> w["set --what-if(预测变更)"]
w --> s["dsc config set(应用)"]
s --> g["dsc config get(确认结果)"]
图6: 只要不打乱“观察→预测→应用→确认”的顺序,声明式配置的应用就不存在一锤定音的恐惧。
配置文档是数据而不是程序,这是它在运维上最大的优点。“这台电脑上应该设置了什么”可以作为 YAML 的差异被评审,变更历史本身就成了配置的变更历史。
6. 让既有资产继续发挥价值 —— PSDSC 资源的适配器与 WinGet Configuration
一听说“v3 是另一个产品”,难免担心过去的资产,但 DSC v3 可以通过适配器资源这个机制调用旧世代的 PSDSC 资源。按 DSC 3.2 及以上的现行名称,面向 PowerShell 7 基于类的资源是 Microsoft.Adapter/PowerShell,面向 Windows PowerShell 5.1 基于 MOF、基于脚本的资源是 Microsoft.Adapter/WindowsPowerShell(此前的名字是 Microsoft.DSC/PowerShell 和 Microsoft.Windows/WindowsPowerShell)。9 多年积累下来的 PSDSC 资源生态,可以从 v3 的配置文档直接触达。
另一个连接点是 WinGet Configuration。在 PC 装机的文章里介绍过的 .winget 文件,从 v3 架构(WinGet 1.11 及以上)开始已经直接把 DSC v3 当作处理引擎来用。只要在配置文件的 metadata 中把处理引擎指定为 dscv3,文档的内容就是 DSC v3 的配置文档本身。10
# WinGet Configuration v3 ── 内容就是 DSC v3 的配置文档
$schema: https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/2023/08/config/document.json
metadata:
winget:
processor:
identifier: dscv3
resources:
- name: 应用的运行模式
type: Microsoft.Windows/Registry
properties:
keyPath: HKCU\Software\MyCompany\App
valueName: Mode
valueData:
String: standard
这里有一处需要注意的地方。既有的 v2 格式(用 properties.configurationVersion: 0.2.0 并把资源放在 properties 之下的写法)文件,并不能原样在 dscv3 处理引擎上运行。v2 文件仍会在原来的处理引擎上继续工作,但要放到 DSC v3 上,就要按照官方的转换指南(示例仓库里的“Convert to v3”)迁移写法。10
flowchart TB
accTitle: 以 DSC v3 为中心的分层结构
accDescr: winget configure 或 Azure Machine Configuration 这样的编排层调用 DSC v3,DSC v3 直接调用原生资源,而既有的 PSDSC 资源则经由适配器资源调用的分层结构
orch["winget configure・Machine Configuration"] --> dsc["dsc.exe(DSC v3)"]
dsc --> native["原生资源(Registry 等)"]
dsc --> adapter["适配器资源"]
adapter --> psdsc["既有 PSDSC 资源(PowerShell 资产)"]
图7: DSC v3 既是一个独立的工具,同时也是 winget、Azure 这些上层工具的共同基础。既有的 PSDSC 资产就挂在适配器之下。
也就是说,用 v3 学到的知识和写下的配置,在手边的 dsc.exe 上、在装机用的 winget configure 上、在云端管理的 Machine Configuration 上都通用。这不是重新学,而是汇流。1
7. 让它跑在日常运维里 —— 用 Git 管理,检测漂移
配置文档的存放地点要选Git 仓库。这样一来,配置变更就走上了“用拉取请求评审、合并、再应用”这条和软件开发一样的流程。步骤文档忘了更新这个概念本身就消失了。
应用之后的课题是配置漂移(有人手动改了设置,于是渐渐偏离应有的状态)。在 DSC 里,漂移检测就等于定期执行 dsc config test。test 不做任何更改,所以能把检测和修复分开,这是很重要的性质。先只把检测自动化,修复(set)则等看清差异内容之后再做,这才是稳妥的做法。
# 定期执行用:区分 test 本身的失败、单个资源的错误和漂移,三者都以非零退出
$json = dsc config test --file C:\config\standard-pc.dsc.config.yaml
if ($LASTEXITCODE -ne 0 -or -not $json) {
Write-Error "dsc config test 的执行本身失败了(退出码: $LASTEXITCODE)"
exit 2
}
$result = $json | ConvertFrom-Json
if ($result.hadErrors) {
# 文档校验失败或部分资源以非零退出。检查没有跑完,不能报告为健康
Write-Error "部分资源的检查出错了。请确认 messages"
exit 2
}
if ($result.results.result.inDesiredState -contains $false) {
Write-Error "检测到配置漂移"
exit 1
}
定期执行的载体,在客户端电脑上可以用任务计划程序(无人执行的设计在另一篇文章里讲解),在成组的服务器上可以用 CI 运行器。如果组织已经把管理集中到 Azure,那么 Machine Configuration 就是一个托管的承接方,能对 Azure VM 和经由 Azure Arc 纳管的本地服务器做审计与应用。11
flowchart TB
accTitle: 以 Git 为起点的配置管理运维循环
accDescr: 放在 Git 仓库里的配置文档先经拉取请求评审再应用,由任务计划程序或 CI 定期执行 test 检测漂移,确认差异后或者修复、或者回到更新配置的循环
git["Git 仓库(配置文档)"] --> pr["变更用拉取请求评审"]
pr --> apply["用 dsc config set 应用"]
apply --> sched["定期执行:dsc config test"]
sched -->|"检测到漂移"| judge["确认差异并判断如何处置"]
judge -.->|"配置是对的"| fix["用 set 修复"]
judge -.->|"现实是对的"| git
图8: 应对漂移的手段不只有“修复”。如果现场的变更是对的,那么改掉配置文档再合并,才是声明式管理的规矩。
图8 右下角的分支很容易被忽略。漂移并不总是“恶”,有时只是现场必需的变更还没有写回配置而已。这种时候不该把电脑改回去,而应该让配置文档去贴合现实。权威始终在 Git 里的声明——只要守住这条纪律,无论倒向哪一边,管理都不会崩。
8. 限制与坑
把上手之前该知道的限制如实列出来。
没有 LCM。 v1.1 里的 LCM(Local Configuration Manager)是一个常驻代理,它会保存配置并做定期应用和自动修复。v3 是“只在被调用时才动的命令”,不会作为服务常驻。1 如果需要持续强制,就得像上一节那样自己选择执行的载体(任务计划程序、CI、Machine Configuration)。这不是退化,而是把“如何触发执行”开放给现代工具的设计变更,不过带着 v1.1 的 pull server 那套感觉过来的人,确实会一时不适应。
管理员权限的处理。 涉及整台机器的资源(HKLM、Windows 功能等)在 set 时需要提权,通过适配器使用 Windows PowerShell 系的 PSDSC 资源时也以管理员身份运行为前提。6 在写配置文档的阶段就把按用户的设置和按机器的设置分开,执行上下文的设计会轻松很多。
不要把机密写进配置。 配置文档是要放进 Git 的数据。不要把密码和 API 密钥直接写死,而应该做成参数化、在执行时传入的设计。
别人的配置文件要读过再执行。 配置文档拥有通过资源改变系统的能力。从公开仓库拿到的 .winget 文件和配置文档,要先确认内容以及所引用资源的可信度,然后再应用。这是官方文档也明确警告过的运维必修项。12
flowchart TB
accTitle: v1.1 的 LCM 常驻型与 v3 的命令型的对比
accDescr: PSDSC v1.1 里由常驻的 LCM 保存配置并负责定期 pull 和自动修复,而 DSC v3 只是作为命令被启动,因此定期执行的载体要从任务计划程序、CI、Machine Configuration 中自己挑选并准备
v1["PSDSC v1.1:LCM 常驻"] --> pull["保存配置并定期 pull・自动修复"]
v3["DSC v3:只以命令启动"] --> push["执行的载体自己准备"]
push -.-> ex["任务计划程序・CI・Machine Configuration"]
图9: v3 里没有“记住配置并擅自替你修好的某个人”。把这看作不便,还是看作重新拿回了执行控制权,正是设计上的分水岭。
9. 小结 —— 把步骤文档换成仓库
- 现在才开始做 Windows 的声明式 IaC,就用 Microsoft DSC v3(
dsc.exe)。请始终留意,你正在读的资料属于四个“DSC”谱系中的哪一个。3 - DSC 用 YAML/JSON 写的不是“步骤”而是“应有的状态”,由 test(比较)与 set(应用差异) 保证幂等的收敛。先从
dsc resource get/test的观察开始,再用--what-if确认影响,最后应用,这个流程是安全的。7 - 既有的 PSDSC 资源经由适配器、装机用的
.winget资产经由 WinGet Configuration v3 架构,都能汇入 v3 的世界(v2 格式的文件需要按转换指南迁移写法)。910 - v3 里没有 LCM。把配置的正本放在 Git 上,用定期执行的
dsc config test检测漂移,再按“配置是对的就修复、现实是对的就更新配置”的纪律转起来,这就是运维的骨架。
步骤文档的宿命,就是从写下的那一刻起便与现实渐行渐远。声明式的配置管理,把这种偏离变成了“能被检测出来的差异”。先把自己电脑上的几个设置写成配置文档,跑一遍 dsc config test 试试吧。你应该能体会到步骤文档正在被仓库取代的感觉。
相关文章
- 用 winget + PowerShell 自动化 PC 装机 —— 让步骤文档变得可执行
- 该不该把 BAT 迁移到 PowerShell —— 判断标准与迁移实务
- 任务计划程序的任务不执行、以 0x1 结束 —— 原因排查与安全的运维设计
- 从 GPO 迁移到 Intune 的指南 —— 中小企业的现实解
- WSUS 被弃用之后的 Windows Update 管理
相关的咨询领域
小村软件合同公司为大家提供以下支持:Windows 电脑与服务器配置向声明式管理的迁移、装机与公司内部标准环境的自动化,以及把属人化的步骤文档变成可执行的东西。
参考链接
-
Microsoft Learn, Microsoft Desired State Configuration overview. 关于 DSC v3 是一个声明式、幂等的配置平台,不依赖 PowerShell 并可在 Linux・macOS・Windows 上运行;不包含 LCM(Local Configuration Manager),以命令方式启动而不作为服务常驻;通过适配器资源与 PSDSC 资源保持兼容;可以从 winget 的 Microsoft Store 源(稳定版 ID 9NVTPZWRC6KQ)或 GitHub Release 安装;以及 WinGet、Microsoft Dev Box、Azure Machine Configuration 是编排层的早期伙伴。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, DSC configuration documents. 关于配置文档是声明应有状态的 YAML/JSON 数据文件,而“具体怎么设置”由资源承担;必需属性是 $schema 和 resources,每个实例都带有 name・type・properties;用 parameters 和 variables 可以减少重复定义并表达动态的值;由 dsc config get/test/set/export 四种操作来处理;以及支持 ARM 模板表达式函数的一个子集。 ↩ ↩2 ↩3
-
Microsoft Learn, Desired State Configuration (DSC) Overview. 关于 DSC 有四个版本(内置于 Windows PowerShell 5.1 的 PSDSC 1.1、面向 PowerShell 7 的 PSDSC 2.0、用于 Azure Machine Configuration 的 Linux 支持的 PSDSC 3.0 预览版,以及作为不依赖 PowerShell 的独立产品的 Microsoft DSC 3.0),并且 Microsoft DSC 3.0 是真正的跨平台方案、也能使用既有的 PSDSC 资源。 ↩ ↩2
-
Microsoft Learn, DSC Resources. 关于资源是配置对象的标准化接口,用声明式语法写下“什么是应有的状态”,而“具体怎么设置”由资源承担;资源必定具备 Get 和 Test 操作,大多数资源还支持用 Set 强制状态;用完全限定类型名(owner.group.area/name)指定资源;以及适配器资源让非命令型的资源也能被使用。 ↩
-
Microsoft Learn, dsc resource set. 关于 dsc config set 中 DSC 一定会对每个实例做测试(资源自带的 test 实现或合成测试),并只对不处于期望状态的实例调用 set;相对地,单独的 dsc resource set 总是调用 set,是否有事前测试取决于资源清单的 set.implementsPretest;以及对于没有 implementsPretest 的资源,建议在 set 之前先执行 dsc resource test。 ↩
-
Microsoft Learn, Get started with DSC. 关于发现资源、单独调用资源、管理配置文档这一入门流程;用 Microsoft.Windows/Registry 资源的 get・test・set 做单独操作;用 dsc config test/set/get 验证、应用、确认配置;以及处理 Windows PowerShell 系的 PSDSC 资源时需要管理员权限的终端。 ↩ ↩2
-
Microsoft Learn, dsc config set. 关于 dsc config set 是把配置文档中应有的状态应用到系统上的命令,以及用 –what-if 选项可以在不实际做出更改的前提下显示“执行之后什么会怎样改变”的预测。另附 DSC Resource manifest whatIf property,关于当资源没有直接实现 what-if 行为时,这一信息会由 test 结果合成出来。 ↩ ↩2
-
Microsoft Learn, dsc config export. 关于 export 子命令会针对用 –file 或 –input 传入的输入文档中列举的资源,生成并返回定义了全部既有实例的配置文档;输入文档中只能指定清单里带有 export 小节的资源,且每种资源类型只声明一次。 ↩
-
Microsoft Learn, Microsoft.Adapter/WindowsPowerShell. 关于适配器资源让 Windows PowerShell 5.1 兼容的 PSDSC 资源(脚本、类、二进制)可以被 DSC v3 发现和调用;它使用内置的 PSDesiredStateConfiguration 1.1 模块;这个名字在 DSC 3.2 中取代了原来的 Microsoft.Windows/WindowsPowerShell 适配器;以及在 PowerShell 7 上使用基于类的资源时要用 Microsoft.Adapter/PowerShell(旧称 Microsoft.DSC/PowerShell)。 ↩ ↩2
-
Microsoft Learn, WinGet Configuration file v3 schema reference. 关于 WinGet Configuration 的 v3 架构把 DSC v3 当作处理引擎;需要 WinGet 1.11 及以上和 dscv3 处理引擎(作为独立包 Microsoft.DesiredStateConfiguration 自动安装);要在 metadata.winget.processor.identifier 中指定 dscv3 并把 resources 直接写在文档根部;以及官方示例仓库里备有从 v2 格式转换的指南。 ↩ ↩2 ↩3
-
Microsoft Learn, Understanding Azure Machine Configuration. 关于 Azure Policy 的 Machine Configuration 功能可以对 Azure 虚拟机和支持 Azure Arc 的服务器,以托管方式做操作系统内设置的审计(audit)与配置(configure)。 ↩
-
Microsoft Learn, configure 命令 (winget). 关于 winget configure 是用 WinGet Configuration 文件把机器设置成期望状态的命令;执行前应确认文件内容并验证相关资源可信度的警告;以及用 show/list/test/validate/export 子命令可以显示文件内容、列出已应用的配置、把当前状态与期望状态做比对、验证文件、导出配置。 ↩
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
用 winget + PowerShell 自动化 PC 装机 ── 让操作手册可执行
本文整理了让新员工电脑的初始设置具备可复现性的方法,涵盖通过 winget 进行应用安装与 export/import、WinGet Configuration 的声明式配置、用 PowerShell 补充的设置,直至无人值守执行时的注意事项。
Windows 名称解析的顺序 ── hosts、DNS 缓存、LLMNR/mDNS 与 DoH
「解析不了名称」「只有部分电脑连不上」,结果取决于是 hosts、DNS 缓存、DNS 服务器还是 LLMNR/mDNS 给出的答案。本文从机制上梳理 Windows 名称解析的顺序与 DoH 改变了什么,并讲解按层排查的步骤。
快速启动的真面目 ── Windows 的「关机」为什么和重启不一样
Windows 的「关机」默认会变成混合关机,内核与驱动程序被保存到休眠文件,并在下次启动时还原。本文讲解为什么有些问题只有重启才能解决、对运行时间・更新・Wake on LAN 的影响、确认方法以及是否停用的判断。
在 C# 与 PowerShell 中使用 WMI/CIM——硬件信息获取、进程监控与远程查询实务指南
获取电脑序列号、监控磁盘剩余空间、检测进程启动,这些需求的经典答案就是 WMI/CIM。本文讲解 Get-CimInstance 等 CIM cmdlet 的用法与从旧版 Get-WmiObject 的迁移、C# 中 System.Management 与 CIM API ...
组策略(GPO)实务入门——原理、生效确认与 Intune 分工
还不清楚“用 GPO 下发”的含义就在操作 AD 环境吗?本文从实务角度讲解组策略原理与 LSDOU 应用顺序、用 gpupdate、gpresult 确认生效、与 Intune 分工,以及客户方 GPO 改变应用行为的陷阱。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- DSC 好像有好几个版本,我该用哪一个?
- 如果你现在才开始做声明式配置管理,就用 Microsoft DSC v3(dsc.exe)。DSC 一共有四个谱系:内置于 Windows PowerShell 5.1 的 PSDSC v1.1、面向 PowerShell 7 的模块 PSDSC v2、用于 Azure Machine Configuration 的 Linux 支持的 PSDSC v3(预览版),以及被重写为不依赖 PowerShell 的独立命令的 Microsoft DSC v3。v3 是跨平台的,配置不再写成 PowerShell 脚本,而是写成 YAML/JSON 数据,已有的 PSDSC 资源也可以通过适配器继续复用。搜索时加上“DSC v3”“dsc.exe”,更容易把旧世代的资料区分开。
- DSC v3 和步骤脚本(BAT 或 PowerShell)有什么不同?
- 步骤脚本写的是“要执行的步骤”,所以为了第二次执行时不出现重复应用或报错,幂等性得由你自己做进去。DSC 把“应有的状态”写成数据,与当前状态的比较(test)和差异的应用(set)由资源承担。同一份配置文档执行多少次都不要紧,对于已经处于期望状态的项目它什么都不做,因此可以不必在意执行次数地分发和重跑。而且配置本身就是 YAML 数据,用 Git 做差异评审和版本管理比脚本容易得多。
- 已有的 PowerShell DSC 资源和 WinGet Configuration 资产会白费吗?
- 不会白费。DSC v3 可以通过适配器资源(DSC 3.2 及以上为 Microsoft.Adapter/PowerShell 与 Microsoft.Adapter/WindowsPowerShell,此前则是 Microsoft.DSC/PowerShell 与 Microsoft.Windows/WindowsPowerShell)调用基于类和基于 MOF 的既有 PSDSC 资源。另外,WinGet Configuration 从 v3 架构(WinGet 1.11 及以上)开始已经把 DSC v3 当作处理引擎来使用。既有的 v2 格式 .winget 文件仍然可以在原来的处理引擎上运行,但要放到 DSC v3 的处理引擎上,就需要按照官方的转换指南改写成 v3 格式。
- 用 DSC v3 怎样才能“持续地”强制某个配置?
- DSC v3 本身是一个以命令方式启动的工具,它没有 v1.1 里 LCM(Local Configuration Manager)那样的常驻代理和自动修复机制。如果需要持续地应用和审计,就自己用任务计划程序或 CI 定期执行 dsc config test 来检测漂移,或者放到 Azure 的 Machine Configuration(通过 Azure Arc 也能纳管本地服务器)这类编排层上。
- 直接执行 dsc config set 让我有点害怕,能事先确认影响吗?
- 可以。执行 dsc config test,就能在不做任何更改的前提下确认哪些资源实例不处于期望状态。此外,dsc config set 还有 --what-if 选项,可以在不实际更改的情况下显示“执行之后什么会怎样改变”的预测。先用 test 和 --what-if 看清差异,确认没问题再执行 set,这个顺序是安全的。