我试图在Powershell中,在C#中执行SQL查询。我使用ActiveDirectory cmdlet成功完成了这项工作,并希望更进一步。
我的第一个问题是,当以下格式与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,则不会显示任何内容。
这里发生了什么?
答案 0 :(得分:0)
我对C sharp并不是那么好,但是当从PowerShell外部调用脚本时,在执行程序时会有一个标志来绕过执行策略,即
powershell.exe -executionpolicy bypass -command "& '\\somepath\somescript.ps1' "
这允许调用远程脚本,因为即使使用不受限制的集合,我仍然发现它想要提示执行某些脚本,因此例如在任务调度程序中它将无法运行。
同样在导入SQLPS时我也发现添加-DisableNameChecking标志很有用,你可能还想事先推送你的位置并在之后弹出它,否则你将最终进入SQLPS PSdrive而不能访问本地位置你需要它。
答案 1 :(得分: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 });
答案 2 :(得分: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-sql命令。 您应该能够对sqlps模块执行相同的操作。宁可使用SqlServer,因为它是新版本。