未在 SQL Server 的域控制器中设置 RemoteSigned 时出现 SQL Server PowerShell 问题

本文可帮助你解决当域控制器的计算机策略未设置为 SQL Server 的 REMOTESigned by GPO 时所发生的问题。

原始产品版本:SQL Server
原始 KB 数: 2995870

现象

打开 Microsoft SQL Server 2012 或 Microsoft SQL Server 2014 的 SQL Server PowerShell 控制台时,域控制器的计算机策略未设置为 RemoteSigned by Group Policy Object (GPO),可能会收到以下错误消息:

set-executionpolicy:Windows PowerShell 已成功更新执行策略,但设置由在更具体的范围内定义的策略重写。 由于替代,shell 将保留其当前不受限制的有效执行策略。 键入 Get-ExecutionPolicy -List 以查看执行策略设置。
有关详细信息,请参阅
“Get-Help Set-ExecutionPolicy”。
位置:line:1 char:1
+ set-executionpolicy RemoteSigned -scope process -Force

此外, syspolicy_purge_history 如果域控制器未设置为 REMOTESigned by GPO,则作业会在第三步中失败,你可能会收到以下错误消息:

作为用户执行:AJ\devARsqlagt。 作业步骤在 PowerShell 脚本的第 1 行收到错误。 相应的行是“set-executionpolicy RemoteSigned -scope process -Force”。 更正脚本并重新计划该作业。 PowerShell 返回的错误信息为:“安全错误。 '. 进程退出代码 -1。 该步骤失败。

原因

出现此问题的原因是计算机策略未设置为 由 GPO 远程签名 ,并且会推送到成员服务器。 例如,如果域控制器设置的执行策略如下所示:

Scope -                   ExecutionPolicy
--------------------------------------------------------------
MachinePolicy -           Unrestricted
UserPolicy -              Undefined
Process -                 RemoteSigned
CurrentUser -             Undefined
LocalMachine -            RemoteSigned

MachinePolicy 优先于所有其他策略。

组策略从域控制器推送到与该组策略关联的成员服务器。 这将设置为“不受限制MachinePolicy模式,SQL Server PowerShell 尝试使用RemoteSigned执行策略运行。 因此,会发生冲突的情况,作业 syspolicy_purge_history 失败。 无论域控制器中的计算机策略如何,同一作业都会在 SQL Server 中成功运行。

解决方法

作为安全措施,SQL Server 2012 在 RemoteSigned 策略中启动 SQL PowerShell。 这会导致作业失败,并出现上一个问题。

从安全角度来看,绝对不建议使用不受限制,因为这意味着没有限制。 这是从 SQL 2012 开始的原因,当 MachinePolicy 设置为 RemoteSigned in Domain Controller 时,PowerShell 脚本会成功运行。

若要解决此问题,请使用以下某种方法:

  • 不要通过 GPO 设置域控制器的计算机策略。 如果未定义,则表示下一级策略(例如 UserPolicy、Process、CurrentUser 和 Last LocalMachine)优先。

  • 在Active Directory 用户和计算机中创建新的组织单位(OU),并将此 OU 与组策略链接。 然后为 RemoteSigned 策略启用它。 为此,请按照下列步骤进行操作:

    1. 转到Active Directory 用户和计算机

    2. 右键单击你的 ->New ->Organizational Unit 以创建新的组织单位。

    3. 在“运行”中键入 gpmc.msc ,然后右键单击“ 组策略对象 ->新建 ”以创建新的 GPO

    4. 右键单击新创建的 GPO ->Edit。 它将打开一个新窗口。

    5. 转到计算机配置 -策略 ->>管理模板 ->Windows 组件 ->Windows PowerShell -> 双击“打开脚本执行”。

    6. 执行策略 设置为“允许本地脚本”和“远程签名脚本”。

    7. 单击“应用”,然后单击“确定”

    8. 转到Active Directory 用户和计算机,然后单击“计算机”。 可以找到域的计算机列表。 右键单击要在新创建的组织单位中移动的计算机。 通过这种方式,可以将单台计算机或一组计算机移到组织单位。

    9. 转到组策略管理,右键单击新建的组织单位,单击“链接现有 GPO”,选择新建的 GPO,然后单击“确定”。

    10. 通过在 PowerShell 中运行以下命令,在域控制器和客户端计算机上更新策略。

      gpupdate /force
      
    11. 验证组织单位和客户端组件的计算机策略,它应为 RemoteSigned。

参考

关于执行策略