如何使用PowerShell所需的状态配置升级Windows服务

时间:2016-02-09 21:43:50

标签: powershell service dsc

以下是我的配置示例,安装工作正常,但如果我更换' \\ BuildMachine \ Output \ MyService.exe'使用较新版本的DSC因文件使用错误而失败。使用DSC升级Windows服务的正确方法是什么?感谢。

Configuration ServiceTestConfiguration {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName xPSDesiredStateConfiguration

    Node localhost
    {
        File EnsureLatestServiceExist {
            Ensure = 'Present'
            Type = 'File'
            Checksum = 'ModifiedDate'
            SourcePath = '\\BuildMachine\Output\MyService.exe'
            DestinationPath = 'c:\MyService\MyService.exe'
        }

        xService EnsureServiceStarted {
            Ensure = 'Present'
            DependsOn = '[File]EnsureLatestServiceExist'
            Name = 'MyService'
            DisplayName = 'My Service'
            Description = 'My Service'
            Path = 'c:\MyService\MyService.exe'
            StartupType = 'Automatic'
            State = 'Running'
        }
    }
}

3 个答案:

答案 0 :(得分:2)

我还没有找到完成此操作的内置方法,但Script资源可以让你做任何事情。

添加脚本资源,检查远程(源)文件是否已更新。如果远程文件已更新,请停止该服务。使文件资源依赖于脚本资源,以便它在文件复制之前运行。服务资源将最后运行并再次启动服务。

Script StopServiceCheck
{
    SetScript = 
    {
        Stop-Service -Name ServiceName -Force
    }
    TestScript = 
    {
        $LocalFile = "C:\Path\To\Local.exe"
        $RemoteFile = "\\Path\To\Remote.exe"

        #Returns false if the remote file is newer than the local file or use -eq
        return ((Get-Item -Path $RemoteFile).LastWriteTime -le (Get-Item -Path $LocalFile).LastWriteTime) 
    }
    GetScript = 
    {
        $LocalFile = "C:\Path\To\Local.exe"
        $RemoteFile = "\\Path\To\Remote.exe"
        $return = @{Result = "Executables match"}

        If ((Get-Item -Path $RemoteFile).LastWriteTime -gt (Get-Item -Path $LocalFile).LastWriteTime) { $return.Result = "Remote file is newer" }

        return $return
    }
}

答案 1 :(得分:1)

开源PowerShell模块Carbon为此目的提供了自定义DSC资源:http://get-carbon.org/Carbon_Service.html

答案 2 :(得分:0)

这不是一个理想状态,它是两个理想状态。

第一个期望的状态是:服务已正确关闭并准备好进行维护

第二个所需状态是:该服务处于活动状态并使用最新版本的代码运行。

将其写为两个脚本。