我开始在 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"