web-dev-qa-db-ja.com

Powershellを使用したSQLエージェントジョブステップがネットワーク共有を見つけられない

ステップの1つでネットワークドライブを見つけることができないPowerShellを実行しているSQLジョブステップがあります。簡潔にするために、このサーバーをプロダクションと呼びます。ネットワーク共有はプロダクションではD:\であり、ジョブはプロダクションで実行されています。 SQL Serverエージェントサービスアカウントでの実行に問題があるPowerShellジョブステップ。

最初のジョブステップでは、ネットワーク共有に入力ファイルを作成します。 2番目のジョブステップは、最初のステップの出力ファイルの情報に基づいて電子メールをキューに入れます。このジョブは、プロダクションと呼ばれるサーバーで実行されます。ネットワーク共有は、ジョブが実行されるサーバーに基づいています。ここでは、D:\ドライブと呼びます。 SELECT-STRING .. -Path "\\ network share .."を使用すると、ジョブステップを書き込むときにジョブが失敗しますが、SELECT-STRINGを使用すると.. -Path "D:..正常に実行されます!

スクリプトを作成するためのオプションが表示される場合に備えて、以下のコードにジョブトークンを保持しました。ここに解決策がありますが、D:を持たない別のサーバーでこのスクリプトを使用する必要がある可能性があり、保守性のためにネットワーク共有名を使用します。

最初のジョブステップはファイルを作成します(CmdExecとして実行):

SQLCmd -S <server> -U <me> -P <Passw0rd> -d <DB> -w 1000 -m-1 -b -i "\\<network share>\Results\20120117_02 Err Message Monitor.sql" -o "\\<network share>\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt"

Powershellとして実行される2番目のジョブステップ(以下にリストされている特定の問題行

$sel = SELECT-STRING "Nothing to do" -path "\\<network share>\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt"
if ($sel -eq $null) {
    Invoke-Sqlcmd -Query "
SET QUOTED_IDENTIFIER ON;
EXEC DBATools.dbo.s_DBAEmailINS
    @ToList = '[email protected]',
    @Subject = '(Prod) Message Monitor',
    @AttachmentList = '\\<network share>\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt';"
}
else {
    Invoke-Sqlcmd -Query "
SET QUOTED_IDENTIFIER ON;
EXEC DBATools.dbo.s_DBAEmailINS
    @ToList = '[email protected]',
    @Subject = 'Nothing to do (Prod) Message Monitor',
    @AttachmentList = '\\<network share\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt';"
}

問題はここにあります

$sel = SELECT-STRING "Nothing to do" -path "\\<network share>\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt"

これは機能します:

$sel = SELECT-STRING "Nothing to do" -path "D:\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt"
if ($sel -eq $null) {
    Invoke-Sqlcmd -Query "
SET QUOTED_IDENTIFIER ON;
EXEC DBATools.dbo.s_DBAEmailINS
    @ToList = '[email protected]',
    @Subject = '(Prod) Message Monitor',
    @AttachmentList = '\\<network share>\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt';"
}
else {
    Invoke-Sqlcmd -Query "
SET QUOTED_IDENTIFIER ON;
EXEC DBATools.dbo.s_DBAEmailINS
    @ToList = '[email protected]',
    @Subject = 'Nothing to do (Prod) Message Monitor',
    @AttachmentList = '\\<network share\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt';"
}

プロキシアカウントはありません。

このジョブで-Pathを取得してネットワーク共有にアクセスするにはどうすればよいですか?

2
Vic Work

これが答えである理由を説明することはできませんが、それは次のとおりです。

$sel = SELECT-STRING "Nothing to do" -path "D:\Results\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt"

変更:

New-PSDrive -Name "P" -PSProvider FileSystem -Root "\\<network share\Results"
$sel = SELECT-STRING "Nothing to do" -path "P:\Ad-hoc\Results\20120117_02\Production.20120117_02.$(ESCAPE_NONE(STRTDT)).$(ESCAPE_NONE(STRTTM)).txt"

実行に成功しました!権限の変更はありませんでしたが、Powershellを実行するには、[PS-Driveを使用した一時的な]ローカルパスが必要だと思います。再びZERO権限が変更され、「P:\」を「\\ network share\Results」に置き換えると失敗します。

これが私が必要としたものです。ネットワーク共有名は変更されませんが、サーバーのドライブ文字が変更される可能性があるため、これを維持でき、他のジョブで再利用できます。

3
Vic Work