#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. На данный момент это будет служить временным решением. Спасибо за ваше предложение.