goo*_*ate 4 c# deployment powershell powershell-2.0 powershell-remoting
我有以下示例Powershell脚本嵌入在我的C#应用程序中.
Powershell代码
$MeasureProps = "AssociatedItemCount", "ItemCount", "TotalItemSize"
$Databases = Get-MailboxDatabase -Status
foreach($Database in $Databases) {
$AllMBStats = Get-MailboxStatistics -Database $Database.Name
$MBItemAssocCount = $AllMBStats | %{$_.AssociatedItemCount.value} | Measure-Object -Average -Sum
$MBItemCount = $AllMBStats | %{$_.ItemCount.value} | Measure-Object -Average -Sum
New-Object PSObject -Property @{
Server = $Database.Server.Name
DatabaseName = $Database.Name
ItemCount = $MBItemCount.Sum
}
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio为我提供了以下嵌入选项:

我见过的每个PowerShell示例(Exchange上的 MSDN 和MSFT 开发人员中心)都要求我将Powershell命令切换为"位"并通过解析器发送.
我不想在我的应用程序中留下大量PS1文件,我需要一个没有其他"支持"PS1文件的二进制文件.
我怎样才能这样做myapp.exe是我的客户唯一看到的东西?
许多客户不愿意放弃限制执行政策,因为他们并不真正了解它.这不是一个安全边界 - 它只是一个额外的箍跳过,所以你不要射击自己的脚.如果要在自己的应用程序中运行ps1脚本,只需使用自己的运行空间并使用基本授权管理器,该管理器不关注系统执行策略:
InitialSessionState initial = InitialSessionState.CreateDefault();
// Replace PSAuthorizationManager with a null manager which ignores execution policy
initial.AuthorizationManager = new
System.Management.Automation.AuthorizationManager("MyShellId");
// Extract psm1 from resource, save locally
// ...
// load my extracted module with my commands
initial.ImportPSModule(new[] { <path_to_psm1> });
// open runspace
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
RunspaceInvoke invoker = new RunspaceInvoke(runspace);
// execute a command from my module
Collection<PSObject> results = invoker.Invoke("my-command");
// or run a ps1 script
Collection<PSObject> results = invoker.Invoke("c:\temp\extracted\my.ps1");
Run Code Online (Sandbox Code Playgroud)
通过使用空授权管理器,将完成执行策略的忽略.请记住 - 这不是一些"黑客",因为执行策略是保护用户免受攻击的原因.这不是为了防范恶意第三方.
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |