我在 SQL Server 代理作业步骤期间执行 Powershell 脚本时遇到问题。我的 powershell 命令基本上连接到远程计算机(在同一个域内)以将单个值写入注册表。从 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)
我的问题是,当我像这样指定远程目标机器时出现异常:
$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 中却无法自动启用,这是怎么回事?
答案1
这是因为该脚本正在使用 SQL Agent 服务运行,并且该服务正在使用本地帐户运行。
您应该将要运行脚本的服务帐户(使用)更改services.msc
为您域中在其他服务器上具有权限的帐户。
答案2
根据异常描述文本,您的脚本从内置的“本地系统”帐户(NT AUTHORITY\SYSTEM)运行。这是一个强大的帐户,可以完全访问计算机,但无权访问网络。
您的问题:[WMIClass]“\$computername\root\default:StdRegProv” 没有返回 Wmi-Object 而是返回 Wmi-Class +,而使用类型加速器 [WMIClass] 时无法为远程机器提供凭据。
在 Powershell v.2 Microsoft改进的 WMI 支持并且您可以尝试使用一些附加参数更改脚本以指定远程访问所需的凭据(如下所示:$reg = get-wmiobject -list -namespace root\default -computername $computer -credential domain\user | where-object { $_.name -eq "StdRegProv" }
它返回的是命名空间 root\default 中的 WMI 类 StdRegProv,类似于 WMI-type-accellerator-command。