問題:PowerShellスクリプトでSql Server Agentジョブを実行できないというお客様がいます。次のメッセージで失敗します。
Message
Executed as user: xxNC\SQLService. Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Environment.GetEnvironmentVariable(String variable, EnvironmentVariableTarget target) at
System.Management.Automation.ModuleIntrinsics.GetExpandedEnvironmentVariable(String name, EnvironmentVariableTarget target) at
System.Management.Automation.ModuleIntrinsics.SetModulePath() at
System.Management.Automation.ExecutionContext.InitializeCommon(AutomationEngine engine, PSHost hostInterface) at
System.Management.Automation.AutomationEngine..ctor(PSHost hostInterface, RunspaceConfiguration runspaceConfiguration, InitialSessionState iss) at
System.Management.Automation.Runspaces.LocalRunspace.DoOpenHelper() at
System.Management.Automation.Runspaces.RunspaceBase.CoreOpen(Boolean syncCall)
at Microsoft.SqlServer.Management.PowerShell .CustomRunspaceConfiguration.HandleAgentJob(RunspaceConfiguration config) at
Microsoft.SqlServer.Management.PowerShell .CustomRunspaceConfiguration.Main(String[] args). Process Exit Code -1073741819. The step failed.
ご覧のとおり、Powershellスクリプト自体についてではありません。問題は、PowerShellスクリプトを実行することです。
テストするために、いくつかの簡単なPowerShellを使用して新しいジョブを作成しました。これは、別のWindows Server 2008(Powershell 3.0を搭載したWindows Server 2008 R2 Enterprise)でテストを行い、そこで機能します。問題のあるサーバーでPowerShellコマンドから実行することもできます。しかし、SQL Serverエージェントジョブを作成して実行すると、同じメッセージで失敗します。だから私には、SQL Serverと比較してPowerShellの構成方法に問題があるようです…
Systeminfo:
私は以下を確認しました:
1)PowerShellコマンドライン(およびSQL Management Studioから起動したSQL Server PowerShellコマンド)から:$ PSVersionTable:
PS C:\Users\xxx> $PSVersionTable
Name Value
---- -----
CLRVersion 2.0.50727.5485
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
2)これも問題ないようです:$ Get-ExecutionPolicyRemoteSigned
3)SSMSで直接実行すると、次のようなコマンドが実行されます。
xp_cmdshell 'PowerShell.exe $PSVersionTable'
私もエラーが発生します:
“The Shell cannot be started. A failure occurred during initialization:
Object reference not set to an instance of an object.”
There is an error in the Event log, with this message: ‘ErrorMessage=Object reference not set to an instance of an object.’
したがって、同じエラーである必要があります。イベントログからのスタックトレースがありません。
現在、エラーを探す場所のアイデアが不足しています。したがって、どこを見ればよいかについての提案は大歓迎です。唯一のことは、PowerShellがバージョン2.0のみであることです。しかし、これはその問題ではないと思いますか?たぶん、SQL ServerエージェントはPowerShellスクリプトの実行を許可されていませんか?どうすれば確認できますか?それともセキュリティの問題かもしれませんか?ジョブの所有者は「sa」です。ジョブステップのエントリとして実行中は「SQL Serverエージェントサービスアカウント」です。
同様の問題に関する投稿はほとんど見つかりませんでした。 Fx。 SQLエージェントからリモートPowershellスクリプトを実行 しかし、それは私の問題を解決しません。
(私は主に.NET開発者なので、SQL ServerとPowershellは私の最強の側面ではありません)。
問題を再現する良い方法があるようです:
xp_cmdshell 'PowerShell.exe $PSVersionTable'
次のステップは、トレースを実行して、エラーが発生している場所を判別することです。再現でスタックトレースを取得していないため、 Process Monitor を実行することから始めます。
まず、Powershell.exeという名前のプロセスでフィルター処理を行い、キャプチャしたデータに基づいてフィルターを調整します。私の疑いは、これがWindowsサービスアカウントのPowerShellプロファイルの問題であることが判明することですが、うまくいけば、Process Monitorを使用すると、一般的な-1073741819につながるエラーがわかりますさまざまなWindowsライブラリのデフォルトまたは不明なエラー。
重要な編集:Visual Studio [〜#〜] errlook [〜#〜] 機能によると、エラーメッセージ投稿のスタックトレースの右下隅に表示される-1073741819は、0xC0000005に変換されます。これは、STATUS_ACCESS_VIOLATION
ではntstatus.h
として定義されています。一部のコンポーネントが正しくインストールされていないか、何かがコンポーネントに干渉している可能性があります(アンチウイルスなど)。アクセス違反が発生している場合は、Windowsのアプリケーションログにも詳細が記録されている可能性があります。
すべてのイベントのバッファリングによる大量のメモリの消費を回避するために、慣れるまで、最初に非稼働環境で実行中のプロセスモニターをテストし、「フィルターされたイベントの削除」オプションを選択することをお勧めします。