客户拒绝环境中的"脚本".如何在C#应用程序中嵌入*.ps1?

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是我的客户唯一看到的东西?

x0n*_*x0n 6

许多客户不愿意放弃限制执行政策,因为他们并不真正了解它.这不是一个安全边界 - 它只是一个额外的箍跳过,所以你不要射击自己的脚.如果要在自己的应用程序中运行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)

通过使用空授权管理器,将完成执行策略的忽略.请记住 - 这不是一些"黑客",因为执行策略是保护用户免受攻击的原因.这不是为了防范恶意第三方.

http://www.nivot.org/nivot2/post/2012/02/10/Bypassing-Restricted-Execution-Policy-in-Code-or-in-Script.aspx