0

C# 内の Powershell 内から SQL クエリを実行しようとしています。私は ActiveDirectory コマンドレットを使用してこれを行うことに成功しており、さらに一歩進めたいと考えていました。

私の最初の問題は、次の形式が ActiveDirectory (および ISE) で動作する一方で、C# では失敗することです。

using (PowerShell pS = PowerShell.Create())
    {
        pS.AddCommand("import-module");
        pS.AddArgument("sqlps");
        pS.Invoke();
    }

セキュリティを Unrestricted に設定してからずっと経ちましたが、次のようなエラーが表示されます。

CmdletInvocationException が処理されませんでした

このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\sqlps\Sqlps.ps1 を読み込めません。詳細については、 http: //go.microsoft.com/fwlink/ ?LinkID=135170 で about_Execution_Policies を参照してください。

ただし、このように実行するとエラーは発生しませんが、後で「Get-Module -all」を呼び出してもモジュールの兆候は示されません。

using (PowerShell pS = PowerShell.Create())
    {
        pS.AddScript("Import-Module sqlps");
        pS.Invoke();
    }

その後、ActiveDirectory モジュールをインポートして Get-Module を呼び出しても、何も表示されません。

何が起きてる?

4

3 に答える 3

0

sqlServer ps モジュールでも同様の問題がありました。C# から実行する場合、これを機能させるには、モジュールを実行空間に手動でロードする必要があるようです。

string scriptText = File.ReadAllText("yourScript.ps1");

//This is needed to use Invoke-sqlcommand in powershell. The module needs to be loaded into the runspace before executing the powershell.

InitialSessionState initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new string[] { @"SqlServer\SqlServer.psd1" });

Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();

using (PowerShell psInstance = PowerShell.Create())
{
   psInstance.Runspace = runspace;
   psInstance.AddScript(scriptText);
   var PSOutput = psInstance.Invoke();
}

また、SqlServer.psd1 にあるすべての参照を追加します。このファイルは通常、「C:\Program Files\WindowsPowerShell\Modules\SqlServer」にあります。リモートサーバーで実行できるように、ソリューションにフォルダーを追加しました。Powershell から invoke-sqlcommand を実行するには、Microsoft.SqlServer.BatchParser.dll 参照を追加する必要があります。sqlps モジュールでも同じことができるはずです。むしろ、新しい SqlServer を使用してください。

于 2018-11-02T09:31:54.483 に答える