远程Powershell注册表命令拒绝SQL Server代理访问


1

我在执行SQL Server代理作业步骤期间无法执行Powershell脚本。我的powershell命令基本上连接到远程计算机(在同一域内),以将单个值写入注册表。从SQL机器,我能够成功地在本地(从Powershell ISE界面)手动运行Powershell脚本,因此我知道它可以工作。问题出在远程服务器上SQL Server代理的权限中,但我在此方面一无所知。

如果我使用根计算机“。”,则此Powershell命令将在我的SQL Agent Job步骤中工作。

# 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)

我的问题是当我像这样指定远程目标计算机时出现异常:

$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的异常:0x80070005(E_ACCESSDENIED))”。处理退出代码-1。该步骤失败。

我尝试启用防火墙端口和程序(在目标服务器和源服务器上)没有任何运气。它可以手动运行,但不能在SQL中自动运行,这有什么用?

Answers:


1

这是因为脚本与SQL Agent服务一起运行,而此服务与本地帐户一起运行。

您应该将使用goint运行脚本的服务帐户(使用services.msc)更改为域中的一个帐户,并在其他服务器上具有特权。

在此处输入图片说明


这很好。现在这很有意义,但不幸的是,我没有设置此SQL Server。感谢您指出这一点,非常有帮助!
D3vtr0n 2011年

1
关于@Devtron,请不要在这里使用传统帐户。在Active Directory上创建一个所谓的服务帐户。这意味着其密码永不过期且无法更改的帐户。这是因为,例如,如果您在此处使用管理员帐户,并且某天更改密码SQL将失败。
里卡多·波罗

1

根据构思描述文本,您的脚本从内置的“本地系统”帐户(NT AUTHORITY \ SYSTEM)运行。这个功能强大的帐户具有对计算机的完全访问权限,但没有任何访问网络的权限。

您的问题:[WMIClass]“ \ $ computername \ root \ default:StdRegProv”在使用类型加速器[WMIClass]时不会返回Wmi对象,而是Wmi-Class +,因此无法为远程计算机提供凭据。机。

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

像WMI-type-accellerator-command一样,返回名称空间root \ default中的WMI类StdRegProv。


里卡多·波罗的答案解决了我的问题。显然,凭据足以供Powershell使用。感谢您的回答!
D3vtr0n 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.