远程Powershellregistry命令上的SQL Server代理访问被拒绝

在SQL Server代理作业步骤中执行Powershell脚本时遇到问题。 我的powershell命令基本上连接到一个远程机器(在同一个域内)写入一个单一的值到registry。 从SQL机器上,我能够在本地手动运行PowerShell脚本(从Powershell ISE界面),所以我知道它的工作原理。 问题在于SQL Server代理在远程机器上的权限,但是在这方面我很无能。

如果我使用根计算机“。”,这个Powershell命令将在我的SQL代理作业步骤中工作。

# Access the DBQ registry setting for pausing $HKLM = 2147483650 #HKEY_LOCAL_MACHINE $reg = [wmiclass]'\\.\root\default:StdRegprov' $key = "SOFTWARE\MySoftwareApplication" $name = "PauseModule" $value = "1" $reg.SetStringValue($HKLM, $key, $name, $value) 

我的问题是,当我指定远程目标机器时,我得到一个exception:

 $reg = [wmiclass]'\\XXX.XX.XXX.XXX\root\default:StdRegprov' 

这是一个例外:

以用户身份执行:DB-MAIN \ SYSTEM。 作业步骤在PowerShell脚本的第4行收到错误。 相应的行是'$ reg = [wmiclass]'\ XXX.XX.XXX.XXX \ root \ default:StdRegprov''。 纠正脚本并重新安排工作。 PowerShell返回的错误信息是:'无法转换值\ XXX.XX.XXX.XXX \ root \ default:StdRegprov“键入”System.Management.ManagementClass“。 错误:“访问被拒绝(来自HRESULT的exception:0x80070005(E_ACCESSDENIED))”'。 处理退出代码-1。 该步骤失败。

我试图启用防火墙端口和程序(在目标和源服务器上)没有运气。 它在SQL中手动工作,但不是自动的,是什么给了?

这是因为脚本正在使用SQL代理服务运行,并且此服务正在使用本地帐户运行。

您应该更改服务的帐户,以便使用services.msc从您的域中以其他服务器上的权限运行脚本。

在这里输入图像说明

根据exeception描述文本您的脚本从内置的“本地系统”帐户(NT AUTHORITY \ SYSTEM)运行。 这是function强大的帐户,可以完全访问计算机,但无权访问networking。

您的问题:[WMIClass]“\ $计算机名\根\默认:StdRegProv”不使用types加速器[WMIClass]返回一个Wmi对象,但Wmi-Class +不能提供凭据远程 – 机。

在Powershell v.2中,Microsoft 改进了对WMI的支持 ,您可以尝试使用一些附加参数来更改脚本,以指定远程访问所需的凭据(如下所示: $ reg = get-wmiobject -list -namespace root \ default -computername $ computer -凭证域\用户|其中对象{$ _。名称-eq“StdRegProv”}

这个返回的WMI类的StdRegProv在命名空间root \ default中就像WMI-type-accellerator-command一样。