none
リモートからのsmo取得に関して RRS feed

  • 質問

  • お世話になります。

    以下の内容で、リモートからSMOのDB内容を取得しようとしているのですが失敗してしまいます。 [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") $server = New-Object Microsoft.SqlServer.Management.Smo.Server("DB名") $server.ConnectionContext.LoginSecure = $false $server.ConnectionContext.Login = "username" $server.ConnectionContext.Password = "password" $dbinfos = @() #フォーマット $fmt = "#,##0.0" foreach($db in $server.Databases | where-object{!($_.IsSystemObject)}) {   foreach($fileGroup in $db.FileGroups) { foreach($dataFile in $fileGroup.Files) {   $space = ($dataFile.Size - $dataFile.AvailableSpace) $output = New-Object -TypeName PSObject -Property @{ DBName = $db.Name FileName = $dataFile.FileName Type = "Data File" UsedSpace = ($space / 1KB).Tostring($fmt) } $dbinfos += $output; } } ------エラー内容----- コレクションの列挙中に次の例外が発生しました: "Culture is not supported. Parameter name: culture 66577 (0x10411) is an invalid culture identifier."。 発生場所 C:\Users\管理者ID\Desktop\output\sizecalc.ps1:12 文字:27 + foreach($fileGroup in $db.FileGroups) + ~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], ExtendedTypeSystemException + FullyQualifiedErrorId : ExceptionInGetEnumerator 尚、DBのローカル上から実行すると問題無く取得できます。 原因と対処方法はどの様なものが考えられるでしょうか。

    宜しくお願い致します。

    2014年11月13日 12:27

すべての返信

  • こんにちは、

    回答では有りませんが当方の状況を、ご参考までに。

    以下のような感じに最小ロジックにして試してみましたが、特に問題はなさそうでした。

    [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") 
    $server = 
    New-Object Microsoft.SqlServer.Management.Smo.Server("SV1")
    $server.ConnectionContext.LoginSecure = $false 
    $server.ConnectionContext.Login = "sa" 
    $server.ConnectionContext.Password = "hogehoge" 
     
    #データベースの数だけ繰り返し
    foreach ( $db in $server.Databases )
    {
        $db.Name
    }

    環境は、
    サーバー側が、2008ServerR2,SQLServer2012
    クライアントはWindows7とWindows8で試しました。(SMOのバージョンは10と11が入っているっぽい・・・)

    なかなか検索しても当該エラーメッセージはヒットしないようなので難しいですね。

    別のサーバーで試してみたり、クライアントで試した見たりと、何かしら依存環境を絞り込むしか無いのですかね・・・。



    2014年11月14日 7:49
  • お返事ありがとうございます。

    当初は一つ上の段の、

    foreach($db in $server.Databases | ?{!($_.IsSystemObject)}) で同エラーが出力されていましたが、

    「?」を「where-object」へ変更したところ、エラーが無くなり、今の foreach($fileGroup in $db.FileGroups)の部分で

    同じエラーが出力されました。

    接続先のロケール等が関係あるのでしょうか。

    2014年11月14日 10:28
  • 私も回答ではないのですが…

    INF: 照合順序指定子 Japanese_Unicode を使用する場合の注意点照合順序 - 文字の比較と並び順 (その 1) - Microsoft SQL Server Japan Support Team Blog - Site Home - MSDN Blogsなどの記述によると、ロケールID 66577(Japanese_Unicode)は、SQL Server 7.0との互換性のために残された古い日本語照合順序指定子のようです。

    エラーメッセージには"Culture is not supported."とあるので、文字通りリモート側OSでサポートされていないロケールなのではないでしょうか。

    2014年11月14日 23:49
    モデレータ