DSC,如何知道在运行配置后是否需要重新启动

Jup*_*aol 6 windows powershell windows-server-2012 dsc

所以我使用的是 DSC 推送模式

我每天有大约 200 次部署到多个环境 (DEV/INT/QA/PROD)

每次部署时,我都想确保每个服务器都配置正确

所以我自动运行 DSC 作为我部署的一部分,完全没有用户交互

所以我想知道是否有办法知道在运行 DSC 配置后是否需要重新启动/重启

基本上在运行这条线之后

Start-DscConfiguration -Wait -Force -Path .\SomePath
Run Code Online (Sandbox Code Playgroud)

我如何配置包的示例

   Package MVC3
    {
        Name = "Microsoft ASP.NET MVC 3"
        Ensure = "Present"
        Path = "$Env:SystemDrive\AspNetMVC3ToolsUpdateSetup.exe"
        ProductId = "DCDEC776-BADD-48B9-8F9A-DFF513C3D7FA"
        Arguments = "/q"
        DependsOn = "[WindowsFeature]IIS"
        Credential = $Credential
    }

   Package MVC4
    {
        Name = "Microsoft ASP.NET MVC 4 Runtime"
        Ensure = "Present"
        Path = "$Env:SystemDrive\AspNetMVC4Setup.exe"
        ProductId = "942CC691-5B98-42A3-8BC5-A246BA69D983"
        Arguments = "/q"
        DependsOn = "[Package]MVC3"
        Credential = $Credential
    }
Run Code Online (Sandbox Code Playgroud)

Rya*_*ies 6

我过去一直使用的是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ PendingFileRenameOperations 注册表值。如果它不是空的 - 那么你正在等待重新启动。请注意,除非您等待重新启动,否则注册表值甚至不应该存在。它在重新启动时被删除。所以,如果你没有看到它,那就是原因。

编辑:也把这个键扔进去:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\UpdateExeVolatile

这两个键一起应该告诉你重启是否挂起。

查看这篇 Microsoft 文章 - 尽管该文章是关于 Exchange 的,但它清楚地提到检查这两个注册表值是 Exchange 如何知道重启是否挂起:http : //technet.microsoft.com/en-us/library/ cc164360(v=EXCHG.80).aspx

2014 年 10 月 29 日编辑: Microsoft 发布了一个名为xPendingReboot的新 Desired State Configuration 资源,它可以很好地确定您的系统是否等待重启。它通过查看以下注册表项列表来做到这一点:

$ComponentBasedServicing = (Get-ChildItem 'hklm:SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\').Name.Split("\") -contains "RebootPending"
$WindowsUpdate = (Get-ChildItem 'hklm:SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\').Name.Split("\") -contains "RebootRequired"
$PendingFileRename = (Get-ItemProperty 'hklm:\SYSTEM\CurrentControlSet\Control\Session Manager\').PendingFileRenameOperations.Length -gt 0
$ActiveComputerName = (Get-ItemProperty 'hklm:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName').ComputerName
$PendingComputerName = (Get-ItemProperty 'hklm:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName').ComputerName
$PendingComputerRename = $ActiveComputerName -ne $PendingComputerName
Run Code Online (Sandbox Code Playgroud)