运行 PowerShell 步骤所需的 MSSQL 代理系统权限

运行 PowerShell 步骤所需的 MSSQL 代理系统权限

我开始在 StackExchange DBA 上询问这个问题,但后来决定这可能更像是一个 Windows Server 安全类型的问题。

Server 2012 R2 上的 SQL Server 2016 SP1+CU。

我正在尝试使用代理用户在 SQL 代理作业中运行 PowerShell 步骤,并且在执行任何代码之前尝试执行内部管理时遇到问题。

因此,代理用户包含在 SQL Agent PowerShell 子系统中。我只需一步就可以制作一个示例作业,运行“Get-Date”。该作业出错:

Executed as user: Domain\ProxyUser. A job step received an error at line 1 in a PowerShell script. The corresponding line is 'set-executionpolicy RemoteSigned -scope process -Force'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'Access denied   '.  Process Exit Code -1.  The step failed.

MachinePolicy、UserPolicy 和 LocalMachine 均在 RemoteSigned 处设置,因此不存在范围问题,而且无论如何都会产生不同的错误。

如果我将代理用户置于机器的本地管理员中,问题就会消失,脚本可以正常运行。我在系统的 Windows 安全日志中看到了此访问:

Object:
    Object Server:  Security
    Object Type:    File
    Object Name:    \Device\ConDrv
    Object Handle:  0x4

Process Information:
    Process ID: 0x6350
    Process Name:   C:\Windows\System32\conhost.exe

Requested Operation:
    Desired Access: DELETE
            READ_CONTROL
            WRITE_DAC
            WRITE_OWNER
            SYNCHRONIZE
            ReadData (or ListDirectory)
            WriteData (or AddFile)
            AppendData (or AddSubdirectory or CreatePipeInstance)
            ReadEA
            WriteEA
            Execute/Traverse
            DeleteChild
            ReadAttributes
            WriteAttributes

Privileges:     SeTakeOwnershipPrivilege

看起来这基本上和@MaddHatter 四年前在这个链接上遇到的问题是一样的:

SQL 代理 Powershell 作业因非管理员代理而失败

将此用户置于本地管理员是唯一的选择吗?这似乎是解决问题的一种相当笨拙的方法。我如何才能最好地定制这些代理用户的权限,以便作业可以运行?

答案1

您可以尝试使用 Sysinternals 进程监视器查看 SQLAgent(或者 powershell)进程的运行情况:
https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx
使用此工具您将能够看到“拒绝访问”来自何处。

另一种选择是使用“操作系统(CmdExec)”步骤而不是 powershell,并像这样调用 powershell 脚本:

powershell.exe -File "C:\Path\To\File.ps"

相关内容