PowerShell и SQL Server: попытка получить данные для объекта не удалась для управляемого компьютера

#sql-server #powershell #powershell-5.0

#sql-сервер #powershell #powershell-5.0

Вопрос:

В настоящее время я пишу сценарий для установки нового экземпляра SQL Server с помощью PowerShell.
В этом сценарии после создания экземпляра я отключаю динамический порт и присваиваю ему новый фиксированный порт.

 Import-Module SqlPs

[...] # Install a new instance SQL Server

$wmi = (Get-Item "SQLServer:SQL$Env:ComputerName").ManagedComputer
$urn = "ManagedComputer[@Name='$Env:ComputerName']/ ServerInstance[@Name='$Instance']/ ServerProtocol[@Name='Tcp']"
$tcp = $wmi.GetSmoObject($urn)
$tcp.IPAddresses['IPAll'].IPAddressProperties['TcpPort'].Value         = "$Port"
$tcp.IPAddresses['IPAll'].IPAddressProperties['TcpDynamicPorts'].Value = ""
$tcp.Alter()
  

Этот скрипт работает правильно, но когда я пытаюсь запустить его второй раз в том же окне PowerShell, он возвращает следующую ошибку :

 Exception calling "GetSmoObject" with "1" argument(s): "Attempt to retrieve data for object failed for ManagedComputer 'MYSERVER'."
At .New-Instance.ps1:316 char:5
      $tcp = $wmi.GetSmoObject($urn)
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
      FullyQualifiedErrorId : FailedOperationException

$Error[0] | Format-List -Force
Exception             : System.Management.Automation.MethodInvocationException: Exception calling "GetSmoObject" with "1" argument(s): "Attempt to retrieve data for object failed for ManagedComputer 'MYSERVER'." --->
                        Microsoft.SqlServer.Management.Smo.FailedOperationException: Attempt to retrieve data for object failed for ManagedComputer 'MYSERVER'. ---> Microsoft.SqlServer.Management.Smo.MissingObjectException: The
                        ServerInstance 'MYINSTANCE' does not exist on the server.
                           at Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer.GetSmoObjectRec(Urn urn)
                           at Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer.GetSmoObjectRec(Urn urn)
                           at Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer.GetSmoObject(Urn urn)
                           --- End of inner exception stack trace ---
                           at Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer.GetSmoObject(Urn urn)
                           at CallSite.Target(Closure , CallSite , Object , Object )
                           --- End of inner exception stack trace ---
                           at System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception)
                           at System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
                           at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
                           at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
TargetObject          :
CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
FullyQualifiedErrorId : FailedOperationException
ErrorDetails          :
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, D:SqlServerScriptsNew-Instance.ps1: line 316
                        at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {}
PSMessageDetails      :


  

Тем не менее, экземпляр ‘MYINSTANCE’ был успешно установлен. Я думаю, что восстановленный управляемый компьютер не был обновлен и не включает новый экземпляр ‘MYINSTANCE’.

Как я могу принудительно обновить восстановленный управляемый компьютер?

Моя версия PowerShell :

 $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14393  3471
  

Комментарии:

1. Я думаю, вам может потребоваться выйти и повторно запустить PowerShell ISE, чтобы перезагрузить домен приложения. Вместо этого попробуйте запустить скрипт из командной строки (например powershell -File ".YourScript.ps1" ), чтобы каждый экземпляр сценария был отдельным сеансом PS.

2. Повторный запуск PoweerShell также является единственным «решением», которое я нашел на данный момент. Запуск сценария из командной строки работает каждый раз, но я предпочитаю решение, которое пользователи могут запускать непосредственно из PowerShell. На данный момент это будет служить временным решением. Спасибо за ваше предложение.