0

我正在尝试在 C# 中的 Powershell 中执行 SQL 查询。我已经使用 ActiveDirectory cmdlet 成功地做到了这一点,并希望更进一步。

我的第一个问题是,虽然以下格式适用于 ActiveDirectory(和 ISE),但它在 C# 中失败:

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

我早就将安全设置为无限制,但我得到的错误是:

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

我对 C sharp 不是很好,但是当从 powershell 外部调用脚本时,执行程序时会出现一个标志以绕过执行策略,即

powershell.exe -executionpolicy bypass -command "& '\\somepath\somescript.ps1' "

这允许调用远程脚本,因为即使使用不受限制的设置,我仍然发现它想要提示执行某些脚本,因此例如在任务调度程序中它只会无法运行。

此外,在导入 SQLPS 时,我还发现添加 -DisableNameChecking 标志很有用,您可能还希望事先推送您的位置并在之后弹出它,否则您将最终进入 SQLPS PSdrive,如果您需要它无法访问本地位置.

于 2014-06-20T10:34:55.800 回答
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”中。我将文件夹添加到我的解决方案中,以便能够在远程服务器上执行。您需要添加 Microsoft.SqlServer.BatchParser.dll 引用才能从 Powershell 执行 invoke-sqlcommand。您应该能够对 sqlps 模块执行相同的操作。而是使用较新的 SqlServer。

于 2018-11-02T09:31:54.483 回答
0

你尝试过这样的事情吗?

        PowerShell ps = PowerShell.Create();
        ps.AddScript("set-executionpolicy unrestricted -scope process");
        ps.AddScript("import-module sqlps");
        ps.AddScript("get-module sqlps");

        var m = ps.Invoke();
        foreach (var mm in m.Select(x => x.BaseObject as PSModuleInfo))
            Console.WriteLine(new { mm.Name, mm.Version });
于 2016-04-18T22:09:53.607 回答