У меня проблемы с выполнением сценария Powershell на этапе задания агента SQL Server. Мои команды 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. Шаг задания получил ошибку в строке 4 сценария PowerShell. Соответствующая строка: '$ 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, что дает?
Согласно тексту описания исключения, ваш скрипт запускается из встроенной учетной записи «Локальная система» (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 | где-объект {$ _. name -eq "StdRegProv"}
Это возвращает WMI-класс StdRegProv в пространстве имен root \ default, как и команда WMI-type-accelerator.
Это связано с тем, что сценарий выполняется со службой агента SQL, а эта служба работает с локальной учетной записью.
Вы должны изменить учетную запись службы, которая запускает скрипт, используя services.msc
, одному из вашего домена с привилегиями на других серверах.