【问题标题】:Remove a PowerShell DSC Configuration删除 PowerShell DSC 配置
【发布时间】:2014-08-16 04:06:46
【问题描述】:

是否可以在应用 DSC 配置后从计算机中删除它?

例如,我有一个configuration 块如下:

configuration SevenZip {
    Script Install7Zip {
        GetScript = {
            $7ZipFolder = '{0}\7-Zip' -f $env:ProgramFiles;
            $Result = @{
                Result = '';
                }
            if (Test-Path -Path $7ZipFolder) {
                $Result.Result = 'Present';
            }
            else {
                $Result.Result = 'Nonpresent';
            }
            Write-Verbose -Message $Result.Result;
            $Result;
        }
        SetScript = {
            $7ZipUri = 'http://colocrossing.dl.sourceforge.net/project/sevenzip/7-Zip/9.20/7z920-x64.msi';
            $OutputFile = '{0}\7-Zip.msi' -f $env:TEMP;
            Invoke-WebRequest -Uri $7ZipUri -OutFile $OutputFile;
            Write-Verbose -Message ('Finished downloading 7-Zip MSI file to {0}.' -f $OutputFile);

            $ArgumentList = '/package "{0}" /passive /norestart /l*v "{1}\Install 7-Zip 9.20 64-bit.log"' -f $OutputFile, $env:TEMP;
            $Process = Start-Process -FilePath msiexec.exe -ArgumentList $ArgumentList -Wait -PassThru;
            Write-Verbose -Message ('Process finished with exit code: {0}' -f $Process.ExitCode);
            Remove-Item -Path $OutputFile;
            Write-Verbose -Message ('Removed MSI file: {0}' -f $OutputFile);
        }
        TestScript = {
            $7ZipFolder = '{0}\7-Zip' -f $env:ProgramFiles;
            if (Test-Path -Path $7ZipFolder) {
                $true;
            }
            else {
                $false;
            }
        }
    }    
}

如果未找到该应用程序,此配置块将生成一个 MOF,该 MOF 使用 Script 资源在应用它的系统上安装 7-Zip 9.20 64 位。

应用此配置后,如果不再需要 7-Zip,如何使用以下命令将其从系统中删除

SevenZip -OutputPath c:\dsc\7-Zip;
Start-DscConfiguration -Wait -Path C:\dsc\7-Zip -Verbose;

【问题讨论】:

    标签: powershell dsc


    【解决方案1】:

    要将 7zip 安装移出范围,您可以应用另一个未指定 7zip 的配置。配置不会“回滚”,因此,如果已安装,它将保持安装状态。如果稍后删除,则不会重新安装。

    您也可以走手动路线,从 c:\windows\system32\configuration 中删除配置文件。您需要删除 Current.mof、backup.mof 和可能的 Previous.mof。

    【讨论】:

      【解决方案2】:

      Remove-DscConfigurationDocument 可以解决问题 https://technet.microsoft.com/en-us/library/mt143544.aspx

      Remove-DscConfigurationDocument cmdlet 从 DSC 配置存储中删除配置文档(.mof 文件)。在配置期间,Start-DscConfiguration cmdlet 将 .mof 文件复制到目标计算机上的文件夹中。此 cmdlet 会删除该配置文档并进行额外的清理。

      【讨论】:

        【解决方案3】:

        史蒂文是正确的。当我运行这个时:

        删除-项目 C:\Windows\System32\Configuration\Current.mof, C:\Windows\System32\Configuration\backup.mof, C:\Windows\System32\Configuration\Previous.mof

        现在 Get-DscConfiguration 返回与干净机器相同的错误:

        Get-DscConfiguration:当前配置不存在。首先启动 DSC 配置以创建当前配置。

        这就是我想要的。我知道它不会还原配置。我只是想“撤消”正在应用的配置。

        谢谢!

        【讨论】:

        • 是的,这就是这个问题的意图! :)
        【解决方案4】:

        配置中的资源只能是Present(必需)或Absent(不需要)。要稍后回滚配置,您需要应用新配置。 DSC 中的脚本资源不支持 Ensure-property,因此要反转脚本,您需要在新配置 AFAIK 中创建修改后的脚本资源。

        配置应该包括一个TestScript,如果安装了7zip,则返回false,以及一个SetScript,用于卸载软件。几乎与你现在所拥有的相反。

        你也可以修改你的配置,让脚本资源在本地下载 msi 文件,然后有一个包资源来实际安装它(或卸载它),DependsOn 设置为下载脚本。这将是一种更简洁的配置方法。 install-config 和 uninstall-config 之间的唯一区别是安装/卸载 msi 的 Package-resource 中的 Ensure = PresentEnsure = Absent

        无论哪种方式,您都需要应用新的配置来指定不应安装该软件。

        如果仅在您的配置过程中需要 7zip(执行一些其他脚本资源),那么也许您可以执行以下操作(未经测试):

        configuration ExtractFolder {
        
            Script Download7zip {
                GetScript = { }
                SetScript = { #downloads msi locally }
                TestScript = { }
            }
        
            Package Install7zip
            {
                Ensure = "Present"
                Path  = "c:\pathToMsi\7zip.msi"
                Name = "7Zip"
                ProductId = "ACDDCDAF-80C6-41E6-A1B9-8ABD8A05027E" #7zip prodid
                DependsOn = [Script]Download7zip
            } 
        
            Script RunScript{
                GetScript = { }
                SetScript = { #unpack some file using 7zip }
                TestScript = { }
                DependsOn = [Package]Install7zip
            }
        
            Package Uninstall7zip
            {
                Ensure = "Absent"
                Path  = "c:\pathToMsi\7zip.msi"
                Name = "7Zip"
                ProductId = "ACDDCDAF-80C6-41E6-A1B9-8ABD8A05027E" #7zip prodid
                DependsOn = [Script]RunScript
            }
        }
        

        如果上述方法有效,则可能需要将 ConfigurationMode-settings 设置为 ApplyOnly。监控和自动应用可能会被两个相反的包资源混淆。

        【讨论】:

        • 感谢您的回答,但我不想“确保”未安装 7-Zip。我根本不想应用任何配置,因为我不在乎是否安装了 7-Zip。例如,如果我将 500 种不同的配置应用到服务器上,结果却拖慢了它的速度怎么办?如何删除部分或全部这些配置?
        • 你好@CookieMonster!我的印象是,只要 DSC 本地配置管理器 (LCM) 将其 ConfigurationMode 设置为 ApplyAndAutocorrect,配置总是适用于系统。据我所知,这适用于推/拉配置。让我知道我是否错了。 technet.microsoft.com/en-us/library/dn249922.aspx
        • @TrevorSullivan 回复:如果您将 500 种不同的配置应用于服务器 - 您只能将一种配置应用于服务器。它可以定义 500 个资源。如果它降低了系统速度,那么要么调整资源的测试功能,要么用精简的东西替换配置并以另一种方式监控状态。
        【解决方案5】:

        也许应用“空”配置可能有效?

        听起来 DSC 是一种单行道。应用配置后,您必须继续使用 DSC 来管理该服务器。 将 LCM 设置为 ApplyOnly 不是最好的主意,因为您可能想在某个时候对该机器应用其他东西?

        【讨论】:

          【解决方案6】:

          我的猜测是你必须自己实现卸载脚本配置。我认为您无法恢复您的配置。

          在我看来,您应该将配置称为“Install-SevenZip”。

          顺便说一句,感谢这个有趣的说明如何使用脚本资源。

          否则,您是否检查了 Package 资源来管理应用程序的安装?这可能更合适,即使我不知道是否可以像您一样使用此资源从互联网下载软件包。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-06-22
            • 1970-01-01
            • 1970-01-01
            • 2018-06-16
            • 2018-01-10
            • 2015-05-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多