From Gamboge Crane, 3 Days ago, written in Plain Text.
This paste will cross the great divide in 11 Months.
Embed
  1. Param([string]$inputFile=$null, [string]$outputFile=$null, [switch]$verbose, [switch] $debug, [switch]$runtime20, [switch]$runtime40,
  2.         [switch]$x86, [switch]$x64, [int]$lcid, [switch]$Sta, [switch]$Mta, [switch]$noConsole, [switch]$nested, [string]$iconFile=$null,
  3.         [string]$title, [string]$description, [string]$company, [string]$product, [string]$copyright, [string]$trademark, [string]$version,
  4.         [switch]$requireAdmin, [switch]$virtualize, [switch]$credentialGUI, [switch]$noConfigfile)
  5.  
  6. <################################################################################>
  7. <##                                                                            ##>
  8. <##      PS2EXE-GUI v0.5.0.13                                                  ##>
  9. <##      Written by: Ingo Karstein (http://blog.karstein-consulting.com)       ##>
  10. <##      Reworked and GUI support by Markus Scholtes                           ##>
  11. <##                                                                            ##>
  12. <##      This script is released under Microsoft Public Licence                ##>
  13. <##          that can be downloaded here:                                      ##>
  14. <##          http://www.microsoft.com/opensource/licenses.mspx#Ms-PL           ##>
  15. <##                                                                            ##>
  16. <################################################################################>
  17.  
  18.  
  19. if (!$nested)
  20. {
  21.         Write-Host "PS2EXE-GUI v0.5.0.13 by Ingo Karstein, reworked and GUI support by Markus Scholtes"
  22. }
  23. else
  24. {
  25.         Write-Host "PowerShell 2.0 environment started..."
  26. }
  27. Write-Host ""
  28.  
  29. if ($runtime20 -and $runtime40)
  30. {
  31.         Write-Host "You cannot use switches -runtime20 and -runtime40 at the same time!"
  32.         exit -1
  33. }
  34.  
  35. if ($Sta -and $Mta)
  36. {
  37.         Write-Host "You cannot use switches -Sta and -Mta at the same time!"
  38.         exit -1
  39. }
  40.  
  41. if ([string]::IsNullOrEmpty($inputFile) -or [string]::IsNullOrEmpty($outputFile))
  42. {
  43.         Write-Host "Usage:"
  44.         Write-Host ""
  45.         Write-Host "powershell.exe -command ""&'.\ps2exe.ps1' [-inputFile] '<file_name>' [-outputFile] '<file_name>' [-verbose]"
  46.         Write-Host "               [-debug] [-runtime20|-runtime40] [-lcid <id>] [-x86|-x64] [-Sta|-Mta] [-noConsole]"
  47.         Write-Host "               [-credentialGUI] [-iconFile '<file_name>'] [-title '<title>'] [-description '<description>']"
  48.         Write-Host "               [-company '<company>'] [-product '<product>'] [-copyright '<copyright>'] [-trademark '<trademark>']"
  49.         Write-Host "               [-version '<version>'] [-noConfigfile] [-requireAdmin] [-virtualize]"""
  50.         Write-Host ""
  51.         Write-Host "    inputFile = Powershell script that you want to convert to EXE"
  52.         Write-Host "   outputFile = destination EXE file name"
  53.         Write-Host "      verbose = output verbose informations - if any"
  54.         Write-Host "        debug = generate debug informations for output file"
  55.         Write-Host "    runtime20 = this switch forces PS2EXE to create a config file for the generated EXE that contains the"
  56.         Write-Host "                ""supported .NET Framework versions"" setting for .NET Framework 2.0/3.x for PowerShell 2.0"
  57.         Write-Host "    runtime40 = this switch forces PS2EXE to create a config file for the generated EXE that contains the"
  58.         Write-Host "                ""supported .NET Framework versions"" setting for .NET Framework 4.x for PowerShell 3.0 or higher"
  59.         Write-Host "         lcid = location ID for the compiled EXE. Current user culture if not specified"
  60.         Write-Host "          x86 = compile for 32-bit runtime only"
  61.         Write-Host "          x64 = compile for 64-bit runtime only"
  62.         Write-Host "          sta = Single Thread Apartment Mode"
  63.         Write-Host "          mta = Multi Thread Apartment Mode"
  64.         Write-Host "    noConsole = the resulting EXE file will be a Windows Forms app without a console window"
  65.         Write-Host "credentialGUI = use GUI for prompting credentials in console mode"
  66.         Write-Host "     iconFile = icon file name for the compiled EXE"
  67.         Write-Host "        title = title information (displayed in details tab of Windows Explorer's properties dialog)"
  68.         Write-Host "  description = description information (not displayed, but embedded in executable)"
  69.         Write-Host "      company = company information (not displayed, but embedded in executable)"
  70.         Write-Host "      product = product information (displayed in details tab of Windows Explorer's properties dialog)"
  71.         Write-Host "    copyright = copyright information (displayed in details tab of Windows Explorer's properties dialog)"
  72.         Write-Host "    trademark = trademark information (displayed in details tab of Windows Explorer's properties dialog)"
  73.         Write-Host "      version = version information (displayed in details tab of Windows Explorer's properties dialog)"
  74.         Write-Host " noConfigfile = write no config file (<outputfile>.exe.config)"
  75.         Write-Host " requireAdmin = if UAC is enabled, compiled EXE run only in elevated context (UAC dialog appears if required)"
  76.         Write-Host "   virtualize = application virtualization is activated (forcing x86 runtime)"
  77.         Write-Host ""
  78.         Write-Host "Input file or output file not specified!"
  79.         exit -1
  80. }
  81.  
  82. $psversion = 0
  83. if ($PSVersionTable.PSVersion.Major -ge 4)
  84. {
  85.         $psversion = 4
  86.         Write-Host "You are using PowerShell 4.0 or above."
  87. }
  88.  
  89. if ($PSVersionTable.PSVersion.Major -eq 3)
  90. {
  91.         $psversion = 3
  92.         Write-Host "You are using PowerShell 3.0."
  93. }
  94.  
  95. if ($PSVersionTable.PSVersion.Major -eq 2)
  96. {
  97.         $psversion = 2
  98.         Write-Host "You are using PowerShell 2.0."
  99. }
  100.  
  101. if ($psversion -eq 0)
  102. {
  103.         Write-Host "The powershell version is unknown!"
  104.         exit -1
  105. }
  106.  
  107. # retrieve absolute paths independent whether path is given relative oder absolute
  108. $inputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($inputFile)
  109. $outputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($outputFile)
  110.  
  111. if (!(Test-Path $inputFile -PathType Leaf))
  112. {
  113.         Write-Host "Input file $($inputfile) not found!"
  114.         exit -1
  115. }
  116.  
  117. if ($inputFile -eq $outputFile)
  118. {
  119.         Write-Host "Input file is identical to output file!"
  120.         exit -1
  121. }
  122.  
  123. if (!([string]::IsNullOrEmpty($iconFile)))
  124. {
  125.         # retrieve absolute path independent whether path is given relative oder absolute
  126.         $iconFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($iconFile)
  127.  
  128.         if (!(Test-Path $iconFile -PathType Leaf))
  129.         {
  130.                 Write-Host "Icon file $($iconFile) not found!"
  131.                 exit -1
  132.         }
  133. }
  134.  
  135. if ($requireAdmin -And $virtualize)
  136. {
  137.         Write-Host "-requireAdmin cannot be combined with -virtualize"
  138.         exit -1
  139. }
  140.  
  141. if (!$runtime20 -and !$runtime40)
  142. {
  143.         if ($psversion -eq 4)
  144.         {
  145.                 $runtime40 = $TRUE
  146.         }
  147.         elseif ($psversion -eq 3)
  148.         {
  149.                 $runtime40 = $TRUE
  150.         }
  151.         else
  152.         {
  153.                 $runtime20 = $TRUE
  154.         }
  155. }
  156.  
  157. if ($psversion -ge 3 -and $runtime20)
  158. {
  159.         Write-Host "To create an EXE file for PowerShell 2.0 on PowerShell 3.0 or above this script now launches PowerShell 2.0..."
  160.         Write-Host ""
  161.  
  162.         $arguments = "-inputFile '$($inputFile)' -outputFile '$($outputFile)' -nested "
  163.  
  164.         if ($verbose) { $arguments += "-verbose "}
  165.         if ($debug) { $arguments += "-debug "}
  166.         if ($runtime20) { $arguments += "-runtime20 "}
  167.         if ($x86) { $arguments += "-x86 "}
  168.         if ($x64) { $arguments += "-x64 "}
  169.         if ($lcid) { $arguments += "-lcid $lcid "}
  170.         if ($Sta) { $arguments += "-Sta "}
  171.         if ($Mta) { $arguments += "-Mta "}
  172.         if ($noConsole) { $arguments += "-noConsole "}
  173.         if (!([string]::IsNullOrEmpty($iconFile))) { $arguments += "-iconFile '$($iconFile)' "}
  174.         if (!([string]::IsNullOrEmpty($title))) { $arguments += "-title '$($title)' "}
  175.         if (!([string]::IsNullOrEmpty($description))) { $arguments += "-description '$($description)' "}
  176.         if (!([string]::IsNullOrEmpty($company))) { $arguments += "-company '$($company)' "}
  177.         if (!([string]::IsNullOrEmpty($product))) { $arguments += "-product '$($product)' "}
  178.         if (!([string]::IsNullOrEmpty($copyright))) { $arguments += "-copyright '$($copyright)' "}
  179.         if (!([string]::IsNullOrEmpty($trademark))) { $arguments += "-trademark '$($trademark)' "}
  180.         if (!([string]::IsNullOrEmpty($version))) { $arguments += "-version '$($version)' "}
  181.         if ($requireAdmin) { $arguments += "-requireAdmin "}
  182.         if ($virtualize) { $arguments += "-virtualize "}
  183.         if ($credentialGUI) { $arguments += "-credentialGUI "}
  184.         if ($noConfigfile) { $arguments += "-noConfigfile "}
  185.  
  186.         if ($MyInvocation.MyCommand.CommandType -eq "ExternalScript")
  187.         {       # ps2exe.ps1 is running (script)
  188.                 $jobScript = @"
  189. ."$($PSHOME)\powershell.exe" -version 2.0 -command "&'$($MyInvocation.MyCommand.Path)' $($arguments)"
  190. "@
  191.         }
  192.         else
  193.         { # ps2exe.exe is running (compiled script)
  194.                 Write-Host "The parameter -runtime20 is not supported for compiled ps2exe.ps1 scripts."
  195.                 Write-Host "Compile ps2exe.ps1 with parameter -runtime20 and call the generated executable (without -runtime20)."
  196.                 exit -1
  197.         }
  198.  
  199.         Invoke-Expression $jobScript
  200.  
  201.         exit 0
  202. }
  203.  
  204. if ($psversion -lt 3 -and $runtime40)
  205. {
  206.         Write-Host "You need to run ps2exe in an Powershell 3.0 or higher environment to use parameter -runtime40"
  207.         Write-Host
  208.         exit -1
  209. }
  210.  
  211. if ($psversion -lt 3 -and !$Mta -and !$Sta)
  212. {
  213.         # Set default apartment mode for powershell version if not set by parameter
  214.         $Mta = $TRUE
  215. }
  216.  
  217. if ($psversion -ge 3 -and !$Mta -and !$Sta)
  218. {
  219.         # Set default apartment mode for powershell version if not set by parameter
  220.         $Sta = $TRUE
  221. }
  222.  
  223. # escape escape sequences in version info
  224. $title = $title -replace "\\", "\\"
  225. $product = $product -replace "\\", "\\"
  226. $copyright = $copyright -replace "\\", "\\"
  227. $trademark = $trademark -replace "\\", "\\"
  228. $description = $description -replace "\\", "\\"
  229. $company = $company -replace "\\", "\\"
  230.  
  231. if (![string]::IsNullOrEmpty($version))
  232. { # check for correct version number information
  233.         if ($version -notmatch "(^\d+\.\d+\.\d+\.\d+$)|(^\d+\.\d+\.\d+$)|(^\d+\.\d+$)|(^\d+$)")
  234.         {
  235.                 Write-Host "Version number has to be supplied in the form n.n.n.n, n.n.n, n.n or n (with n as number)!"
  236.                 exit -1
  237.         }
  238. }
  239.  
  240. Write-Host ""
  241.  
  242. $type = ('System.Collections.Generic.Dictionary`2') -as "Type"
  243. $type = $type.MakeGenericType( @( ("System.String" -as "Type"), ("system.string" -as "Type") ) )
  244. $o = [Activator]::CreateInstance($type)
  245.  
  246. $compiler20 = $FALSE
  247. if ($psversion -eq 3 -or $psversion -eq 4)
  248. {
  249.         $o.Add("CompilerVersion", "v4.0")
  250. }
  251. else
  252. {
  253.         if (Test-Path ("$ENV:WINDIR\Microsoft.NET\Framework\v3.5\csc.exe"))
  254.         { $o.Add("CompilerVersion", "v3.5") }
  255.         else
  256.         {
  257.                 Write-Warning "No .Net 3.5 compiler found, using .Net 2.0 compiler."
  258.                 Write-Warning "Therefore some methods are not available!"
  259.                 $compiler20 = $TRUE
  260.                 $o.Add("CompilerVersion", "v2.0")
  261.         }
  262. }
  263.  
  264. $referenceAssembies = @("System.dll")
  265. if (!$noConsole)
  266. {
  267.         if ([System.AppDomain]::CurrentDomain.GetAssemblies() | ? { $_.ManifestModule.Name -ieq "Microsoft.PowerShell.ConsoleHost.dll" })
  268.         {
  269.                 $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | ? { $_.ManifestModule.Name -ieq "Microsoft.PowerShell.ConsoleHost.dll" } | Select -First 1).Location
  270.         }
  271. }
  272. $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | ? { $_.ManifestModule.Name -ieq "System.Management.Automation.dll" } | Select -First 1).Location
  273.  
  274. if ($runtime40)
  275. {
  276.         $n = New-Object System.Reflection.AssemblyName("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
  277.         [System.AppDomain]::CurrentDomain.Load($n) | Out-Null
  278.         $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | ? { $_.ManifestModule.Name -ieq "System.Core.dll" } | Select -First 1).Location
  279. }
  280.  
  281. if ($noConsole)
  282. {
  283.         $n = New-Object System.Reflection.AssemblyName("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
  284.         if ($runtime40)
  285.         {
  286.                 $n = New-Object System.Reflection.AssemblyName("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
  287.         }
  288.         [System.AppDomain]::CurrentDomain.Load($n) | Out-Null
  289.  
  290.         $n = New-Object System.Reflection.AssemblyName("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
  291.         if ($runtime40)
  292.         {
  293.                 $n = New-Object System.Reflection.AssemblyName("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
  294.         }
  295.         [System.AppDomain]::CurrentDomain.Load($n) | Out-Null
  296.  
  297.         $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | ? { $_.ManifestModule.Name -ieq "System.Windows.Forms.dll" } | Select -First 1).Location
  298.         $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | ? { $_.ManifestModule.Name -ieq "System.Drawing.dll" } | Select -First 1).Location
  299. }
  300.  
  301. $platform = "anycpu"
  302. if ($x64 -and !$x86) { $platform = "x64" } else { if ($x86 -and !$x64) { $platform = "x86" }}
  303.  
  304. $cop = (New-Object Microsoft.CSharp.CSharpCodeProvider($o))
  305. $cp = New-Object System.CodeDom.Compiler.CompilerParameters($referenceAssembies, $outputFile)
  306. $cp.GenerateInMemory = $FALSE
  307. $cp.GenerateExecutable = $TRUE
  308.  
  309. $iconFileParam = ""
  310. if (!([string]::IsNullOrEmpty($iconFile)))
  311. {
  312.         $iconFileParam = "`"/win32icon:$($iconFile)`""
  313. }
  314.  
  315. $reqAdmParam = ""
  316. if ($requireAdmin)
  317. {
  318.         $win32manifest = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>`r`n<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">`r`n<trustInfo xmlns=""urn:schemas-microsoft-com:asm.v2"">`r`n<security>`r`n<requestedPrivileges xmlns=""urn:schemas-microsoft-com:asm.v3"">`r`n<requestedExecutionLevel level=""requireAdministrator"" uiAccess=""false""/>`r`n</requestedPrivileges>`r`n</security>`r`n</trustInfo>`r`n</assembly>"
  319.         $win32manifest | Set-Content ($outputFile+".win32manifest") -Encoding UTF8
  320.  
  321.         $reqAdmParam = "`"/win32manifest:$($outputFile+".win32manifest")`""
  322. }
  323.  
  324. if (!$virtualize)
  325. { $cp.CompilerOptions = "/platform:$($platform) /target:$( if ($noConsole){'winexe'}else{'exe'}) $($iconFileParam) $($reqAdmParam)" }
  326. else
  327. { Write-Host "Application virtualization is activated, forcing x86 platfom."
  328.         $cp.CompilerOptions = "/platform:x86 /target:$( if ($noConsole) { 'winexe' } else { 'exe' } ) /nowin32manifest $($iconFileParam)"
  329. }
  330.  
  331. $cp.IncludeDebugInformation = $debug
  332.  
  333. if ($debug)
  334. {
  335.         $cp.TempFiles.KeepFiles = $TRUE
  336. }
  337.  
  338. Write-Host "Reading input file " -NoNewline
  339. Write-Host $inputFile
  340. Write-Host ""
  341. $content = Get-Content -LiteralPath ($inputFile) -Encoding UTF8 -ErrorAction SilentlyContinue
  342. if ($content -eq $null)
  343. {
  344.         Write-Host "No data found. May be read error or file protected."
  345.         exit -2
  346. }
  347. $scriptInp = [string]::Join("`r`n", $content)
  348. $script = [System.Convert]::ToBase64String(([System.Text.Encoding]::UTF8.GetBytes($scriptInp)))
  349.  
  350. #region program frame
  351. $culture = ""
  352.  
  353. if ($lcid)
  354. {
  355.         $culture = @"
  356.         System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo($lcid);
  357.         System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo($lcid);
  358. "@
  359. }
  360.  
  361. $programFrame = @"
  362. // Simple PowerShell host created by Ingo Karstein (http://blog.karstein-consulting.com) for PS2EXE
  363. // Reworked and GUI support by Markus Scholtes
  364.  
  365. using System;
  366. using System.Collections.Generic;
  367. using System.Text;
  368. using System.Management.Automation;
  369. using System.Management.Automation.Runspaces;
  370. using PowerShell = System.Management.Automation.PowerShell;
  371. using System.Globalization;
  372. using System.Management.Automation.Host;
  373. using System.Security;
  374. using System.Reflection;
  375. using System.Runtime.InteropServices;
  376. $(if ($noConsole) {@"
  377. using System.Windows.Forms;
  378. using System.Drawing;
  379. "@ })
  380.  
  381. [assembly:AssemblyTitle("$title")]
  382. [assembly:AssemblyProduct("$product")]
  383. [assembly:AssemblyCopyright("$copyright")]
  384. [assembly:AssemblyTrademark("$trademark")]
  385. $(if (![string]::IsNullOrEmpty($version)) {@"
  386. [assembly:AssemblyVersion("$version")]
  387. [assembly:AssemblyFileVersion("$version")]
  388. "@ })
  389. // not displayed in details tab of properties dialog, but embedded to file
  390. [assembly:AssemblyDescription("$description")]
  391. [assembly:AssemblyCompany("$company")]
  392.  
  393. namespace ik.PowerShell
  394. {
  395. $(if ($noConsole -or $credentialGUI) {@"
  396.         internal class CredentialForm
  397.         {
  398.                 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  399.                 private struct CREDUI_INFO
  400.                 {
  401.                         public int cbSize;
  402.                         public IntPtr hwndParent;
  403.                         public string pszMessageText;
  404.                         public string pszCaptionText;
  405.                         public IntPtr hbmBanner;
  406.                 }
  407.  
  408.                 [Flags]
  409.                 enum CREDUI_FLAGS
  410.                 {
  411.                         INCORRECT_PASSWORD = 0x1,
  412.                         DO_NOT_PERSIST = 0x2,
  413.                         REQUEST_ADMINISTRATOR = 0x4,
  414.                         EXCLUDE_CERTIFICATES = 0x8,
  415.                         REQUIRE_CERTIFICATE = 0x10,
  416.                         SHOW_SAVE_CHECK_BOX = 0x40,
  417.                         ALWAYS_SHOW_UI = 0x80,
  418.                         REQUIRE_SMARTCARD = 0x100,
  419.                         PASSWORD_ONLY_OK = 0x200,
  420.                         VALIDATE_USERNAME = 0x400,
  421.                         COMPLETE_USERNAME = 0x800,
  422.                         PERSIST = 0x1000,
  423.                         SERVER_CREDENTIAL = 0x4000,
  424.                         EXPECT_CONFIRMATION = 0x20000,
  425.                         GENERIC_CREDENTIALS = 0x40000,
  426.                         USERNAME_TARGET_CREDENTIALS = 0x80000,
  427.                         KEEP_USERNAME = 0x100000,
  428.                 }
  429.  
  430.                 public enum CredUIReturnCodes
  431.                 {
  432.                         NO_ERROR = 0,
  433.                         ERROR_CANCELLED = 1223,
  434.                         ERROR_NO_SUCH_LOGON_SESSION = 1312,
  435.                         ERROR_NOT_FOUND = 1168,
  436.                         ERROR_INVALID_ACCOUNT_NAME = 1315,
  437.                         ERROR_INSUFFICIENT_BUFFER = 122,
  438.                         ERROR_INVALID_PARAMETER = 87,
  439.                         ERROR_INVALID_FLAGS = 1004,
  440.                 }
  441.  
  442.                 [DllImport("credui", CharSet = CharSet.Unicode)]
  443.                 private static extern CredUIReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO creditUR,
  444.                         string targetName,
  445.                         IntPtr reserved1,
  446.                         int iError,
  447.                         StringBuilder userName,
  448.                         int maxUserName,
  449.                         StringBuilder password,
  450.                         int maxPassword,
  451.                         [MarshalAs(UnmanagedType.Bool)] ref bool pfSave,
  452.                         CREDUI_FLAGS flags);
  453.  
  454.                 public class UserPwd
  455.                 {
  456.                         public string User = string.Empty;
  457.                         public string Password = string.Empty;
  458.                         public string Domain = string.Empty;
  459.                 }
  460.  
  461.                 internal static UserPwd PromptForPassword(string caption, string message, string target, string user, PSCredentialTypes credTypes, PSCredentialUIOptions options)
  462.                 {
  463.                         // Flags und Variablen initialisieren
  464.                         StringBuilder userPassword = new StringBuilder(), userID = new StringBuilder(user, 128);
  465.                         CREDUI_INFO credUI = new CREDUI_INFO();
  466.                         if (!string.IsNullOrEmpty(message)) credUI.pszMessageText = message;
  467.                         if (!string.IsNullOrEmpty(caption)) credUI.pszCaptionText = caption;
  468.                         credUI.cbSize = Marshal.SizeOf(credUI);
  469.                         bool save = false;
  470.  
  471.                         CREDUI_FLAGS flags = CREDUI_FLAGS.DO_NOT_PERSIST;
  472.                         if ((credTypes & PSCredentialTypes.Generic) == PSCredentialTypes.Generic)
  473.                         {
  474.                                 flags |= CREDUI_FLAGS.GENERIC_CREDENTIALS;
  475.                                 if ((options & PSCredentialUIOptions.AlwaysPrompt) == PSCredentialUIOptions.AlwaysPrompt)
  476.                                 {
  477.                                         flags |= CREDUI_FLAGS.ALWAYS_SHOW_UI;
  478.                                 }
  479.                         }
  480.  
  481.                         // den Benutzer nach Kennwort fragen, grafischer Prompt
  482.                         CredUIReturnCodes returnCode = CredUIPromptForCredentials(ref credUI, target, IntPtr.Zero, 0, userID, 128, userPassword, 128, ref save, flags);
  483.  
  484.                         if (returnCode == CredUIReturnCodes.NO_ERROR)
  485.                         {
  486.                                 UserPwd ret = new UserPwd();
  487.                                 ret.User = userID.ToString();
  488.                                 ret.Password = userPassword.ToString();
  489.                                 ret.Domain = "";
  490.                                 return ret;
  491.                         }
  492.  
  493.                         return null;
  494.                 }
  495.         }
  496. "@ })
  497.  
  498.         internal class PS2EXEHostRawUI : PSHostRawUserInterface
  499.         {
  500. $(if ($noConsole){ @"
  501.                 // Speicher für Konsolenfarben bei GUI-Output werden gelesen und gesetzt, aber im Moment nicht genutzt (for future use)
  502.                 private ConsoleColor ncBackgroundColor = ConsoleColor.White;
  503.                 private ConsoleColor ncForegroundColor = ConsoleColor.Black;
  504. "@ } else {@"
  505.                 const int STD_OUTPUT_HANDLE = -11;
  506.  
  507.                 //CHAR_INFO struct, which was a union in the old days
  508.                 // so we want to use LayoutKind.Explicit to mimic it as closely
  509.                 // as we can
  510.                 [StructLayout(LayoutKind.Explicit)]
  511.                 public struct CHAR_INFO
  512.                 {
  513.                         [FieldOffset(0)]
  514.                         internal char UnicodeChar;
  515.                         [FieldOffset(0)]
  516.                         internal char AsciiChar;
  517.                         [FieldOffset(2)] //2 bytes seems to work properly
  518.                         internal UInt16 Attributes;
  519.                 }
  520.  
  521.                 //COORD struct
  522.                 [StructLayout(LayoutKind.Sequential)]
  523.                 public struct COORD
  524.                 {
  525.                         public short X;
  526.                         public short Y;
  527.                 }
  528.  
  529.                 //SMALL_RECT struct
  530.                 [StructLayout(LayoutKind.Sequential)]
  531.                 public struct SMALL_RECT
  532.                 {
  533.                         public short Left;
  534.                         public short Top;
  535.                         public short Right;
  536.                         public short Bottom;
  537.                 }
  538.  
  539.                 /* Reads character and color attribute data from a rectangular block of character cells in a console screen buffer,
  540.                          and the function writes the data to a rectangular block at a specified location in the destination buffer. */
  541.                 [DllImport("kernel32.dll", EntryPoint = "ReadConsoleOutputW", CharSet = CharSet.Unicode, SetLastError = true)]
  542.                 internal static extern bool ReadConsoleOutput(
  543.                         IntPtr hConsoleOutput,
  544.                         /* This pointer is treated as the origin of a two-dimensional array of CHAR_INFO structures
  545.                         whose size is specified by the dwBufferSize parameter.*/
  546.                         [MarshalAs(UnmanagedType.LPArray), Out] CHAR_INFO[,] lpBuffer,
  547.                         COORD dwBufferSize,
  548.                         COORD dwBufferCoord,
  549.                         ref SMALL_RECT lpReadRegion);
  550.  
  551.                 /* Writes character and color attribute data to a specified rectangular block of character cells in a console screen buffer.
  552.                         The data to be written is taken from a correspondingly sized rectangular block at a specified location in the source buffer */
  553.                 [DllImport("kernel32.dll", EntryPoint = "WriteConsoleOutputW", CharSet = CharSet.Unicode, SetLastError = true)]
  554.                 internal static extern bool WriteConsoleOutput(
  555.                         IntPtr hConsoleOutput,
  556.                         /* This pointer is treated as the origin of a two-dimensional array of CHAR_INFO structures
  557.                         whose size is specified by the dwBufferSize parameter.*/
  558.                         [MarshalAs(UnmanagedType.LPArray), In] CHAR_INFO[,] lpBuffer,
  559.                         COORD dwBufferSize,
  560.                         COORD dwBufferCoord,
  561.                         ref SMALL_RECT lpWriteRegion);
  562.  
  563.                 /* Moves a block of data in a screen buffer. The effects of the move can be limited by specifying a clipping rectangle, so
  564.                         the contents of the console screen buffer outside the clipping rectangle are unchanged. */
  565.                 [DllImport("kernel32.dll", SetLastError = true)]
  566.                 static extern bool ScrollConsoleScreenBuffer(
  567.                         IntPtr hConsoleOutput,
  568.                         [In] ref SMALL_RECT lpScrollRectangle,
  569.                         [In] ref SMALL_RECT lpClipRectangle,
  570.                         COORD dwDestinationOrigin,
  571.                         [In] ref CHAR_INFO lpFill);
  572.  
  573.                 [DllImport("kernel32.dll", SetLastError = true)]
  574.                         static extern IntPtr GetStdHandle(int nStdHandle);
  575. "@ })
  576.  
  577.                 public override ConsoleColor BackgroundColor
  578.                 {
  579. $(if (!$noConsole){ @"
  580.                         get
  581.                         {
  582.                                 return Console.BackgroundColor;
  583.                         }
  584.                         set
  585.                         {
  586.                                 Console.BackgroundColor = value;
  587.                         }
  588. "@ } else {@"
  589.                         get
  590.                         {
  591.                                 return ncBackgroundColor;
  592.                         }
  593.                         set
  594.                         {
  595.                                 ncBackgroundColor = value;
  596.                         }
  597. "@ })
  598.                 }
  599.  
  600.                 public override System.Management.Automation.Host.Size BufferSize
  601.                 {
  602.                         get
  603.                         {
  604. $(if (!$noConsole){ @"
  605.                                 if (ConsoleInfo.IsOutputRedirected())
  606.                                         // return default value for redirection. If no valid value is returned WriteLine will not be called
  607.                                         return new System.Management.Automation.Host.Size(120, 50);
  608.                                 else
  609.                                         return new System.Management.Automation.Host.Size(Console.BufferWidth, Console.BufferHeight);
  610. "@ } else {@"
  611.                                         // return default value for Winforms. If no valid value is returned WriteLine will not be called
  612.                                 return new System.Management.Automation.Host.Size(120, 50);
  613. "@ })
  614.                         }
  615.                         set
  616.                         {
  617. $(if (!$noConsole){ @"
  618.                                 Console.BufferWidth = value.Width;
  619.                                 Console.BufferHeight = value.Height;
  620. "@ })
  621.                         }
  622.                 }
  623.  
  624.                 public override Coordinates CursorPosition
  625.                 {
  626.                         get
  627.                         {
  628. $(if (!$noConsole){ @"
  629.                                 return new Coordinates(Console.CursorLeft, Console.CursorTop);
  630. "@ } else {@"
  631.                                 // Dummywert für Winforms zurückgeben.
  632.                                 return new Coordinates(0, 0);
  633. "@ })
  634.                         }
  635.                         set
  636.                         {
  637. $(if (!$noConsole){ @"
  638.                                 Console.CursorTop = value.Y;
  639.                                 Console.CursorLeft = value.X;
  640. "@ })
  641.                         }
  642.                 }
  643.  
  644.                 public override int CursorSize
  645.                 {
  646.                         get
  647.                         {
  648. $(if (!$noConsole){ @"
  649.                                 return Console.CursorSize;
  650. "@ } else {@"
  651.                                 // Dummywert für Winforms zurückgeben.
  652.                                 return 25;
  653. "@ })
  654.                         }
  655.                         set
  656.                         {
  657. $(if (!$noConsole){ @"
  658.                                 Console.CursorSize = value;
  659. "@ })
  660.                         }
  661.                 }
  662.  
  663. $(if ($noConsole){ @"
  664.                 private Form InvisibleForm = null;
  665. "@ })
  666.  
  667.                 public override void FlushInputBuffer()
  668.                 {
  669. $(if (!$noConsole){ @"
  670.                         if (!ConsoleInfo.IsInputRedirected())
  671.                         {       while (Console.KeyAvailable)
  672.                         Console.ReadKey(true);
  673.         }
  674. "@ } else {@"
  675.                         if (InvisibleForm != null)
  676.                         {
  677.                                 InvisibleForm.Close();
  678.                                 InvisibleForm = null;
  679.                         }
  680.                         else
  681.                         {
  682.                                 InvisibleForm = new Form();
  683.                                 InvisibleForm.Opacity = 0;
  684.                                 InvisibleForm.ShowInTaskbar = false;
  685.                                 InvisibleForm.Visible = true;
  686.                         }
  687. "@ })
  688.                 }
  689.  
  690.                 public override ConsoleColor ForegroundColor
  691.                 {
  692. $(if (!$noConsole){ @"
  693.                         get
  694.                         {
  695.                                 return Console.ForegroundColor;
  696.                         }
  697.                         set
  698.                         {
  699.                                 Console.ForegroundColor = value;
  700.                         }
  701. "@ } else {@"
  702.                         get
  703.                         {
  704.                                 return ncForegroundColor;
  705.                         }
  706.                         set
  707.                         {
  708.                                 ncForegroundColor = value;
  709.                         }
  710. "@ })
  711.                 }
  712.  
  713.                 public override BufferCell[,] GetBufferContents(System.Management.Automation.Host.Rectangle rectangle)
  714.                 {
  715. $(if ($compiler20) {@"
  716.                         throw new Exception("Method GetBufferContents not implemented for .Net V2.0 compiler");
  717. "@ } else { if (!$noConsole) {@"
  718.                         IntPtr hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  719.                         CHAR_INFO[,] buffer = new CHAR_INFO[rectangle.Bottom - rectangle.Top + 1, rectangle.Right - rectangle.Left + 1];
  720.                         COORD buffer_size = new COORD() {X = (short)(rectangle.Right - rectangle.Left + 1), Y = (short)(rectangle.Bottom - rectangle.Top + 1)};
  721.                         COORD buffer_index = new COORD() {X = 0, Y = 0};
  722.                         SMALL_RECT screen_rect = new SMALL_RECT() {Left = (short)rectangle.Left, Top = (short)rectangle.Top, Right = (short)rectangle.Right, Bottom = (short)rectangle.Bottom};
  723.  
  724.                         ReadConsoleOutput(hStdOut, buffer, buffer_size, buffer_index, ref screen_rect);
  725.  
  726.                         System.Management.Automation.Host.BufferCell[,] ScreenBuffer = new System.Management.Automation.Host.BufferCell[rectangle.Bottom - rectangle.Top + 1, rectangle.Right - rectangle.Left + 1];
  727.                         for (int y = 0; y <= rectangle.Bottom - rectangle.Top; y++)
  728.                                 for (int x = 0; x <= rectangle.Right - rectangle.Left; x++)
  729.                                 {
  730.                                         ScreenBuffer[y,x] = new System.Management.Automation.Host.BufferCell(buffer[y,x].AsciiChar, (System.ConsoleColor)(buffer[y,x].Attributes & 0xF), (System.ConsoleColor)((buffer[y,x].Attributes & 0xF0) / 0x10), System.Management.Automation.Host.BufferCellType.Complete);
  731.                                 }
  732.  
  733.                         return ScreenBuffer;
  734. "@ } else {@"
  735.                         System.Management.Automation.Host.BufferCell[,] ScreenBuffer = new System.Management.Automation.Host.BufferCell[rectangle.Bottom - rectangle.Top + 1, rectangle.Right - rectangle.Left + 1];
  736.  
  737.                         for (int y = 0; y <= rectangle.Bottom - rectangle.Top; y++)
  738.                                 for (int x = 0; x <= rectangle.Right - rectangle.Left; x++)
  739.                                 {
  740.                                         ScreenBuffer[y,x] = new System.Management.Automation.Host.BufferCell(' ', ncForegroundColor, ncBackgroundColor, System.Management.Automation.Host.BufferCellType.Complete);
  741.                                 }
  742.  
  743.                         return ScreenBuffer;
  744. "@ } })
  745.                 }
  746.  
  747.                 public override bool KeyAvailable
  748.                 {
  749.                         get
  750.                         {
  751. $(if (!$noConsole) {@"
  752.                                 return Console.KeyAvailable;
  753. "@ } else {@"
  754.                                 return true;
  755. "@ })
  756.                         }
  757.                 }
  758.  
  759.                 public override System.Management.Automation.Host.Size MaxPhysicalWindowSize
  760.                 {
  761.                         get
  762.                         {
  763. $(if (!$noConsole){ @"
  764.                                 return new System.Management.Automation.Host.Size(Console.LargestWindowWidth, Console.LargestWindowHeight);
  765. "@ } else {@"
  766.                                 // Dummy-Wert für Winforms
  767.                                 return new System.Management.Automation.Host.Size(240, 84);
  768. "@ })
  769.                         }
  770.                 }
  771.  
  772.                 public override System.Management.Automation.Host.Size MaxWindowSize
  773.                 {
  774.                         get
  775.                         {
  776. $(if (!$noConsole){ @"
  777.                                 return new System.Management.Automation.Host.Size(Console.BufferWidth, Console.BufferWidth);
  778. "@ } else {@"
  779.                                 // Dummy-Wert für Winforms
  780.                                 return new System.Management.Automation.Host.Size(120, 84);
  781. "@ })
  782.                         }
  783.                 }
  784.  
  785.                 public override KeyInfo ReadKey(ReadKeyOptions options)
  786.                 {
  787. $(if (!$noConsole) {@"
  788.                         ConsoleKeyInfo cki = Console.ReadKey((options & ReadKeyOptions.NoEcho)!=0);
  789.  
  790.                         ControlKeyStates cks = 0;
  791.                         if ((cki.Modifiers & ConsoleModifiers.Alt) != 0)
  792.                                 cks |= ControlKeyStates.LeftAltPressed | ControlKeyStates.RightAltPressed;
  793.                         if ((cki.Modifiers & ConsoleModifiers.Control) != 0)
  794.                                 cks |= ControlKeyStates.LeftCtrlPressed | ControlKeyStates.RightCtrlPressed;
  795.                         if ((cki.Modifiers & ConsoleModifiers.Shift) != 0)
  796.                                 cks |= ControlKeyStates.ShiftPressed;
  797.                         if (Console.CapsLock)
  798.                                 cks |= ControlKeyStates.CapsLockOn;
  799.                         if (Console.NumberLock)
  800.                                 cks |= ControlKeyStates.NumLockOn;
  801.  
  802.                         return new KeyInfo((int)cki.Key, cki.KeyChar, cks, (options & ReadKeyOptions.IncludeKeyDown)!=0);
  803. "@ } else {@"
  804.                         if ((options & ReadKeyOptions.IncludeKeyDown)!=0)
  805.                                 return ReadKeyBox.Show("", "", true);
  806.                         else
  807.                                 return ReadKeyBox.Show("", "", false);
  808. "@ })
  809.                 }
  810.  
  811.                 public override void ScrollBufferContents(System.Management.Automation.Host.Rectangle source, Coordinates destination, System.Management.Automation.Host.Rectangle clip, BufferCell fill)
  812.                 { // no destination block clipping implemented
  813. $(if (!$noConsole) { if ($compiler20) {@"
  814.                         throw new Exception("Method ScrollBufferContents not implemented for .Net V2.0 compiler");
  815. "@ } else {@"
  816.                         // clip area out of source range?
  817.                         if ((source.Left > clip.Right) || (source.Right < clip.Left) || (source.Top > clip.Bottom) || (source.Bottom < clip.Top))
  818.                         { // clipping out of range -> nothing to do
  819.                                 return;
  820.                         }
  821.  
  822.                         IntPtr hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  823.                         SMALL_RECT lpScrollRectangle = new SMALL_RECT() {Left = (short)source.Left, Top = (short)source.Top, Right = (short)(source.Right), Bottom = (short)(source.Bottom)};
  824.                         SMALL_RECT lpClipRectangle;
  825.                         if (clip != null)
  826.                         { lpClipRectangle = new SMALL_RECT() {Left = (short)clip.Left, Top = (short)clip.Top, Right = (short)(clip.Right), Bottom = (short)(clip.Bottom)}; }
  827.                         else
  828.                         { lpClipRectangle = new SMALL_RECT() {Left = (short)0, Top = (short)0, Right = (short)(Console.WindowWidth - 1), Bottom = (short)(Console.WindowHeight - 1)}; }
  829.                         COORD dwDestinationOrigin = new COORD() {X = (short)(destination.X), Y = (short)(destination.Y)};
  830.                         CHAR_INFO lpFill = new CHAR_INFO() { AsciiChar = fill.Character, Attributes = (ushort)((int)(fill.ForegroundColor) + (int)(fill.BackgroundColor)*16) };
  831.  
  832.                         ScrollConsoleScreenBuffer(hStdOut, ref lpScrollRectangle, ref lpClipRectangle, dwDestinationOrigin, ref lpFill);
  833. "@ } })
  834.                 }
  835.  
  836.                 public override void SetBufferContents(System.Management.Automation.Host.Rectangle rectangle, BufferCell fill)
  837.                 {
  838. $(if (!$noConsole){ @"
  839.                         // using a trick: move the buffer out of the screen, the source area gets filled with the char fill.Character
  840.                         if (rectangle.Left >= 0)
  841.                                 Console.MoveBufferArea(rectangle.Left, rectangle.Top, rectangle.Right-rectangle.Left+1, rectangle.Bottom-rectangle.Top+1, BufferSize.Width, BufferSize.Height, fill.Character, fill.ForegroundColor, fill.BackgroundColor);
  842.                         else
  843.                         { // Clear-Host: move all content off the screen
  844.                                 Console.MoveBufferArea(0, 0, BufferSize.Width, BufferSize.Height, BufferSize.Width, BufferSize.Height, fill.Character, fill.ForegroundColor, fill.BackgroundColor);
  845.                         }
  846. "@ })
  847.                 }
  848.  
  849.                 public override void SetBufferContents(Coordinates origin, BufferCell[,] contents)
  850.                 {
  851. $(if (!$noConsole) { if ($compiler20) {@"
  852.                         throw new Exception("Method SetBufferContents not implemented for .Net V2.0 compiler");
  853. "@ } else {@"
  854.                         IntPtr hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  855.                         CHAR_INFO[,] buffer = new CHAR_INFO[contents.GetLength(0), contents.GetLength(1)];
  856.                         COORD buffer_size = new COORD() {X = (short)(contents.GetLength(1)), Y = (short)(contents.GetLength(0))};
  857.                         COORD buffer_index = new COORD() {X = 0, Y = 0};
  858.                         SMALL_RECT screen_rect = new SMALL_RECT() {Left = (short)origin.X, Top = (short)origin.Y, Right = (short)(origin.X + contents.GetLength(1) - 1), Bottom = (short)(origin.Y + contents.GetLength(0) - 1)};
  859.  
  860.                         for (int y = 0; y < contents.GetLength(0); y++)
  861.                                 for (int x = 0; x < contents.GetLength(1); x++)
  862.                                 {
  863.                                         buffer[y,x] = new CHAR_INFO() { AsciiChar = contents[y,x].Character, Attributes = (ushort)((int)(contents[y,x].ForegroundColor) + (int)(contents[y,x].BackgroundColor)*16) };
  864.                                 }
  865.  
  866.                         WriteConsoleOutput(hStdOut, buffer, buffer_size, buffer_index, ref screen_rect);
  867. "@ } })
  868.                 }
  869.  
  870.                 public override Coordinates WindowPosition
  871.                 {
  872.                         get
  873.                         {
  874.                                 Coordinates s = new Coordinates();
  875. $(if (!$noConsole){ @"
  876.                                 s.X = Console.WindowLeft;
  877.                                 s.Y = Console.WindowTop;
  878. "@ } else {@"
  879.                                 // Dummy-Wert für Winforms
  880.                                 s.X = 0;
  881.                                 s.Y = 0;
  882. "@ })
  883.                                 return s;
  884.                         }
  885.                         set
  886.                         {
  887. $(if (!$noConsole){ @"
  888.                                 Console.WindowLeft = value.X;
  889.                                 Console.WindowTop = value.Y;
  890. "@ })
  891.                         }
  892.                 }
  893.  
  894.                 public override System.Management.Automation.Host.Size WindowSize
  895.                 {
  896.                         get
  897.                         {
  898.                                 System.Management.Automation.Host.Size s = new System.Management.Automation.Host.Size();
  899. $(if (!$noConsole){ @"
  900.                                 s.Height = Console.WindowHeight;
  901.                                 s.Width = Console.WindowWidth;
  902. "@ } else {@"
  903.                                 // Dummy-Wert für Winforms
  904.                                 s.Height = 50;
  905.                                 s.Width = 120;
  906. "@ })
  907.                                 return s;
  908.                         }
  909.                         set
  910.                         {
  911. $(if (!$noConsole){ @"
  912.                                 Console.WindowWidth = value.Width;
  913.                                 Console.WindowHeight = value.Height;
  914. "@ })
  915.                         }
  916.                 }
  917.  
  918.                 public override string WindowTitle
  919.                 {
  920.                         get
  921.                         {
  922. $(if (!$noConsole){ @"
  923.                                 return Console.Title;
  924. "@ } else {@"
  925.                                 return System.AppDomain.CurrentDomain.FriendlyName;
  926. "@ })
  927.                         }
  928.                         set
  929.                         {
  930. $(if (!$noConsole){ @"
  931.                                 Console.Title = value;
  932. "@ })
  933.                         }
  934.                 }
  935.         }
  936.  
  937. $(if ($noConsole){ @"
  938.         public class InputBox
  939.         {
  940.                 [DllImport("user32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
  941.                 private static extern IntPtr MB_GetString(uint strId);
  942.  
  943.                 public static DialogResult Show(string sTitle, string sPrompt, ref string sValue, bool bSecure)
  944.                 {
  945.                         // Generate controls
  946.                         Form form = new Form();
  947.                         Label label = new Label();
  948.                         TextBox textBox = new TextBox();
  949.                         Button buttonOk = new Button();
  950.                         Button buttonCancel = new Button();
  951.  
  952.                         // Sizes and positions are defined according to the label
  953.                         // This control has to be finished first
  954.                         if (string.IsNullOrEmpty(sPrompt))
  955.                         {
  956.                                 if (bSecure)
  957.                                         label.Text = "Secure input:   ";
  958.                                 else
  959.                                         label.Text = "Input:          ";
  960.                         }
  961.                         else
  962.                                 label.Text = sPrompt;
  963.                         label.Location = new Point(9, 19);
  964.                         label.AutoSize = true;
  965.                         // Size of the label is defined not before Add()
  966.                         form.Controls.Add(label);
  967.  
  968.                         // Generate textbox
  969.                         if (bSecure) textBox.UseSystemPasswordChar = true;
  970.                         textBox.Text = sValue;
  971.                         textBox.SetBounds(12, label.Bottom, label.Right - 12, 20);
  972.  
  973.                         // Generate buttons
  974.                         // get localized "OK"-string
  975.                         string sTextOK = Marshal.PtrToStringUni(MB_GetString(0));
  976.                         if (string.IsNullOrEmpty(sTextOK))
  977.                                 buttonOk.Text = "OK";
  978.                         else
  979.                                 buttonOk.Text = sTextOK;
  980.  
  981.                         // get localized "Cancel"-string
  982.                         string sTextCancel = Marshal.PtrToStringUni(MB_GetString(1));
  983.                         if (string.IsNullOrEmpty(sTextCancel))
  984.                                 buttonCancel.Text = "Cancel";
  985.                         else
  986.                                 buttonCancel.Text = sTextCancel;
  987.  
  988.                         buttonOk.DialogResult = DialogResult.OK;
  989.                         buttonCancel.DialogResult = DialogResult.Cancel;
  990.                         buttonOk.SetBounds(System.Math.Max(12, label.Right - 158), label.Bottom + 36, 75, 23);
  991.                         buttonCancel.SetBounds(System.Math.Max(93, label.Right - 77), label.Bottom + 36, 75, 23);
  992.  
  993.                         // Configure form
  994.                         if (string.IsNullOrEmpty(sTitle))
  995.                                 form.Text = System.AppDomain.CurrentDomain.FriendlyName;
  996.                         else
  997.                                 form.Text = sTitle;
  998.                         form.ClientSize = new System.Drawing.Size(System.Math.Max(178, label.Right + 10), label.Bottom + 71);
  999.                         form.Controls.AddRange(new Control[] { textBox, buttonOk, buttonCancel });
  1000.                         form.FormBorderStyle = FormBorderStyle.FixedDialog;
  1001.                         form.StartPosition = FormStartPosition.CenterScreen;
  1002.                         form.MinimizeBox = false;
  1003.                         form.MaximizeBox = false;
  1004.                         form.AcceptButton = buttonOk;
  1005.                         form.CancelButton = buttonCancel;
  1006.  
  1007.                         // Show form and compute results
  1008.                         DialogResult dialogResult = form.ShowDialog();
  1009.                         sValue = textBox.Text;
  1010.                         return dialogResult;
  1011.                 }
  1012.  
  1013.                 public static DialogResult Show(string sTitle, string sPrompt, ref string sValue)
  1014.                 {
  1015.                         return Show(sTitle, sPrompt, ref sValue, false);
  1016.                 }
  1017.         }
  1018.  
  1019.         public class ChoiceBox
  1020.         {
  1021.                 public static int Show(System.Collections.ObjectModel.Collection<ChoiceDescription> aAuswahl, int iVorgabe, string sTitle, string sPrompt)
  1022.                 {
  1023.                         // cancel if array is empty
  1024.                         if (aAuswahl == null) return -1;
  1025.                         if (aAuswahl.Count < 1) return -1;
  1026.  
  1027.                         // Generate controls
  1028.                         Form form = new Form();
  1029.                         RadioButton[] aradioButton = new RadioButton[aAuswahl.Count];
  1030.                         ToolTip toolTip = new ToolTip();
  1031.                         Button buttonOk = new Button();
  1032.  
  1033.                         // Sizes and positions are defined according to the label
  1034.                         // This control has to be finished first when a prompt is available
  1035.                         int iPosY = 19, iMaxX = 0;
  1036.                         if (!string.IsNullOrEmpty(sPrompt))
  1037.                         {
  1038.                                 Label label = new Label();
  1039.                                 label.Text = sPrompt;
  1040.                                 label.Location = new Point(9, 19);
  1041.                                 label.AutoSize = true;
  1042.                                 // erst durch Add() wird die Größe des Labels ermittelt
  1043.                                 form.Controls.Add(label);
  1044.                                 iPosY = label.Bottom;
  1045.                                 iMaxX = label.Right;
  1046.                         }
  1047.  
  1048.                         // An den Radiobuttons orientieren sich die weiteren Größen und Positionen
  1049.                         // Diese Controls also jetzt fertigstellen
  1050.                         int Counter = 0;
  1051.                         foreach (ChoiceDescription sAuswahl in aAuswahl)
  1052.                         {
  1053.                                 aradioButton[Counter] = new RadioButton();
  1054.                                 aradioButton[Counter].Text = sAuswahl.Label;
  1055.                                 if (Counter == iVorgabe)
  1056.                                 { aradioButton[Counter].Checked = true; }
  1057.                                 aradioButton[Counter].Location = new Point(9, iPosY);
  1058.                                 aradioButton[Counter].AutoSize = true;
  1059.                                 // erst durch Add() wird die Größe des Labels ermittelt
  1060.                                 form.Controls.Add(aradioButton[Counter]);
  1061.                                 iPosY = aradioButton[Counter].Bottom;
  1062.                                 if (aradioButton[Counter].Right > iMaxX) { iMaxX = aradioButton[Counter].Right; }
  1063.                                 if (!string.IsNullOrEmpty(sAuswahl.HelpMessage))
  1064.                                 {
  1065.                                          toolTip.SetToolTip(aradioButton[Counter], sAuswahl.HelpMessage);
  1066.                                 }
  1067.                                 Counter++;
  1068.                         }
  1069.  
  1070.                         // Tooltip auch anzeigen, wenn Parent-Fenster inaktiv ist
  1071.                         toolTip.ShowAlways = true;
  1072.  
  1073.                         // Button erzeugen
  1074.                         buttonOk.Text = "OK";
  1075.                         buttonOk.DialogResult = DialogResult.OK;
  1076.                         buttonOk.SetBounds(System.Math.Max(12, iMaxX - 77), iPosY + 36, 75, 23);
  1077.  
  1078.                         // configure form
  1079.                         if (string.IsNullOrEmpty(sTitle))
  1080.                                 form.Text = System.AppDomain.CurrentDomain.FriendlyName;
  1081.                         else
  1082.                                 form.Text = sTitle;
  1083.                         form.ClientSize = new System.Drawing.Size(System.Math.Max(178, iMaxX + 10), iPosY + 71);
  1084.                         form.Controls.Add(buttonOk);
  1085.                         form.FormBorderStyle = FormBorderStyle.FixedDialog;
  1086.                         form.StartPosition = FormStartPosition.CenterScreen;
  1087.                         form.MinimizeBox = false;
  1088.                         form.MaximizeBox = false;
  1089.                         form.AcceptButton = buttonOk;
  1090.  
  1091.                         // show and compute form
  1092.                         if (form.ShowDialog() == DialogResult.OK)
  1093.                         { int iRueck = -1;
  1094.                                 for (Counter = 0; Counter < aAuswahl.Count; Counter++)
  1095.                                 {
  1096.                                         if (aradioButton[Counter].Checked == true)
  1097.                                         { iRueck = Counter; }
  1098.                                 }
  1099.                                 return iRueck;
  1100.                         }
  1101.                         else
  1102.                                 return -1;
  1103.                 }
  1104.         }
  1105.  
  1106.         public class ReadKeyBox
  1107.         {
  1108.                 [DllImport("user32.dll")]
  1109.                 public static extern int ToUnicode(uint wVirtKey, uint wScanCode, byte[] lpKeyState,
  1110.                         [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] System.Text.StringBuilder pwszBuff,
  1111.                         int cchBuff, uint wFlags);
  1112.  
  1113.                 static string GetCharFromKeys(Keys keys, bool bShift, bool bAltGr)
  1114.                 {
  1115.                         System.Text.StringBuilder buffer = new System.Text.StringBuilder(64);
  1116.                         byte[] keyboardState = new byte[256];
  1117.                         if (bShift)
  1118.                         { keyboardState[(int) Keys.ShiftKey] = 0xff; }
  1119.                         if (bAltGr)
  1120.                         { keyboardState[(int) Keys.ControlKey] = 0xff;
  1121.                                 keyboardState[(int) Keys.Menu] = 0xff;
  1122.                         }
  1123.                         if (ToUnicode((uint) keys, 0, keyboardState, buffer, 64, 0) >= 1)
  1124.                                 return buffer.ToString();
  1125.                         else
  1126.                                 return "\0";
  1127.                 }
  1128.  
  1129.                 class KeyboardForm : Form
  1130.                 {
  1131.                         public KeyboardForm()
  1132.                         {
  1133.                                 this.KeyDown += new KeyEventHandler(KeyboardForm_KeyDown);
  1134.                                 this.KeyUp += new KeyEventHandler(KeyboardForm_KeyUp);
  1135.                         }
  1136.  
  1137.                         // check for KeyDown or KeyUp?
  1138.                         public bool checkKeyDown = true;
  1139.                         // key code for pressed key
  1140.                         public KeyInfo keyinfo;
  1141.  
  1142.                         void KeyboardForm_KeyDown(object sender, KeyEventArgs e)
  1143.                         {
  1144.                                 if (checkKeyDown)
  1145.                                 { // store key info
  1146.                                         keyinfo.VirtualKeyCode = e.KeyValue;
  1147.                                         keyinfo.Character = GetCharFromKeys(e.KeyCode, e.Shift, e.Alt & e.Control)[0];
  1148.                                         keyinfo.KeyDown = false;
  1149.                                         keyinfo.ControlKeyState = 0;
  1150.                                         if (e.Alt) { keyinfo.ControlKeyState = ControlKeyStates.LeftAltPressed | ControlKeyStates.RightAltPressed; }
  1151.                                         if (e.Control)
  1152.                                         { keyinfo.ControlKeyState |= ControlKeyStates.LeftCtrlPressed | ControlKeyStates.RightCtrlPressed;
  1153.                                                 if (!e.Alt)
  1154.                                                 { if (e.KeyValue > 64 && e.KeyValue < 96) keyinfo.Character = (char)(e.KeyValue - 64); }
  1155.                                         }
  1156.                                         if (e.Shift) { keyinfo.ControlKeyState |= ControlKeyStates.ShiftPressed; }
  1157.                                         if ((e.Modifiers & System.Windows.Forms.Keys.CapsLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.CapsLockOn; }
  1158.                                         if ((e.Modifiers & System.Windows.Forms.Keys.NumLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.NumLockOn; }
  1159.                                         // and close the form
  1160.                                         this.Close();
  1161.                                 }
  1162.                         }
  1163.  
  1164.                         void KeyboardForm_KeyUp(object sender, KeyEventArgs e)
  1165.                         {
  1166.                                 if (!checkKeyDown)
  1167.                                 { // store key info
  1168.                                         keyinfo.VirtualKeyCode = e.KeyValue;
  1169.                                         keyinfo.Character = GetCharFromKeys(e.KeyCode, e.Shift, e.Alt & e.Control)[0];
  1170.                                         keyinfo.KeyDown = true;
  1171.                                         keyinfo.ControlKeyState = 0;
  1172.                                         if (e.Alt) { keyinfo.ControlKeyState = ControlKeyStates.LeftAltPressed | ControlKeyStates.RightAltPressed; }
  1173.                                         if (e.Control)
  1174.                                         { keyinfo.ControlKeyState |= ControlKeyStates.LeftCtrlPressed | ControlKeyStates.RightCtrlPressed;
  1175.                                                 if (!e.Alt)
  1176.                                                 { if (e.KeyValue > 64 && e.KeyValue < 96) keyinfo.Character = (char)(e.KeyValue - 64); }
  1177.                                         }
  1178.                                         if (e.Shift) { keyinfo.ControlKeyState |= ControlKeyStates.ShiftPressed; }
  1179.                                         if ((e.Modifiers & System.Windows.Forms.Keys.CapsLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.CapsLockOn; }
  1180.                                         if ((e.Modifiers & System.Windows.Forms.Keys.NumLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.NumLockOn; }
  1181.                                         // and close the form
  1182.                                         this.Close();
  1183.                                 }
  1184.                         }
  1185.                 }
  1186.  
  1187.                 public static KeyInfo Show(string sTitle, string sPrompt, bool bIncludeKeyDown)
  1188.                 {
  1189.                         // Controls erzeugen
  1190.                         KeyboardForm form = new KeyboardForm();
  1191.                         Label label = new Label();
  1192.  
  1193.                         // Am Label orientieren sich die Größen und Positionen
  1194.                         // Dieses Control also zuerst fertigstellen
  1195.                         if (string.IsNullOrEmpty(sPrompt))
  1196.                         {
  1197.                                         label.Text = "Press a key";
  1198.                         }
  1199.                         else
  1200.                                 label.Text = sPrompt;
  1201.                         label.Location = new Point(9, 19);
  1202.                         label.AutoSize = true;
  1203.                         // erst durch Add() wird die Größe des Labels ermittelt
  1204.                         form.Controls.Add(label);
  1205.  
  1206.                         // configure form
  1207.                         if (string.IsNullOrEmpty(sTitle))
  1208.                                 form.Text = System.AppDomain.CurrentDomain.FriendlyName;
  1209.                         else
  1210.                                 form.Text = sTitle;
  1211.                         form.ClientSize = new System.Drawing.Size(System.Math.Max(178, label.Right + 10), label.Bottom + 55);
  1212.                         form.FormBorderStyle = FormBorderStyle.FixedDialog;
  1213.                         form.StartPosition = FormStartPosition.CenterScreen;
  1214.                         form.MinimizeBox = false;
  1215.                         form.MaximizeBox = false;
  1216.  
  1217.                         // show and compute form
  1218.                         form.checkKeyDown = bIncludeKeyDown;
  1219.                         form.ShowDialog();
  1220.                         return form.keyinfo;
  1221.                 }
  1222.         }
  1223.  
  1224.         public class ProgressForm : Form
  1225.         {
  1226.                 private Label objLblActivity;
  1227.                 private Label objLblStatus;
  1228.                 private ProgressBar objProgressBar;
  1229.                 private Label objLblRemainingTime;
  1230.                 private Label objLblOperation;
  1231.                 private ConsoleColor ProgressBarColor = ConsoleColor.DarkCyan;
  1232.  
  1233.                 private Color DrawingColor(ConsoleColor color)
  1234.                 {  // convert ConsoleColor to System.Drawing.Color
  1235.                         switch (color)
  1236.                         {
  1237.                                 case ConsoleColor.Black: return Color.Black;
  1238.                                 case ConsoleColor.Blue: return Color.Blue;
  1239.                                 case ConsoleColor.Cyan: return Color.Cyan;
  1240.                                 case ConsoleColor.DarkBlue: return ColorTranslator.FromHtml("#000080");
  1241.                                 case ConsoleColor.DarkGray: return ColorTranslator.FromHtml("#808080");
  1242.                                 case ConsoleColor.DarkGreen: return ColorTranslator.FromHtml("#008000");
  1243.                                 case ConsoleColor.DarkCyan: return ColorTranslator.FromHtml("#008080");
  1244.                                 case ConsoleColor.DarkMagenta: return ColorTranslator.FromHtml("#800080");
  1245.                                 case ConsoleColor.DarkRed: return ColorTranslator.FromHtml("#800000");
  1246.                                 case ConsoleColor.DarkYellow: return ColorTranslator.FromHtml("#808000");
  1247.                                 case ConsoleColor.Gray: return ColorTranslator.FromHtml("#C0C0C0");
  1248.                                 case ConsoleColor.Green: return ColorTranslator.FromHtml("#00FF00");
  1249.                                 case ConsoleColor.Magenta: return Color.Magenta;
  1250.                                 case ConsoleColor.Red: return Color.Red;
  1251.                                 case ConsoleColor.White: return Color.White;
  1252.                                 default: return Color.Yellow;
  1253.                         }
  1254.                 }
  1255.  
  1256.                 private void InitializeComponent()
  1257.                 {
  1258.                         this.SuspendLayout();
  1259.  
  1260.                         this.Text = "Progress";
  1261.                         this.Height = 160;
  1262.                         this.Width = 800;
  1263.                         this.BackColor = Color.White;
  1264.                         this.FormBorderStyle = FormBorderStyle.FixedSingle;
  1265.                         this.ControlBox = false;
  1266.                         this.StartPosition = FormStartPosition.CenterScreen;
  1267.  
  1268.                         // Create Label
  1269.                         objLblActivity = new Label();
  1270.                         objLblActivity.Left = 5;
  1271.                         objLblActivity.Top = 10;
  1272.                         objLblActivity.Width = 800 - 20;
  1273.                         objLblActivity.Height = 16;
  1274.                         objLblActivity.Font = new Font(objLblActivity.Font, FontStyle.Bold);
  1275.                         objLblActivity.Text = "";
  1276.                         // Add Label to Form
  1277.                         this.Controls.Add(objLblActivity);
  1278.  
  1279.                         // Create Label
  1280.                         objLblStatus = new Label();
  1281.                         objLblStatus.Left = 25;
  1282.                         objLblStatus.Top = 26;
  1283.                         objLblStatus.Width = 800 - 40;
  1284.                         objLblStatus.Height = 16;
  1285.                         objLblStatus.Text = "";
  1286.                         // Add Label to Form
  1287.                         this.Controls.Add(objLblStatus);
  1288.  
  1289.                         // Create ProgressBar
  1290.                         objProgressBar = new ProgressBar();
  1291.                         objProgressBar.Value = 0;
  1292.                         objProgressBar.Style = ProgressBarStyle.Continuous;
  1293.                         objProgressBar.ForeColor = DrawingColor(ProgressBarColor);
  1294.                         objProgressBar.Size = new System.Drawing.Size(800 - 60, 20);
  1295.                         objProgressBar.Left = 25;
  1296.                         objProgressBar.Top = 55;
  1297.                         // Add ProgressBar to Form
  1298.                         this.Controls.Add(objProgressBar);
  1299.  
  1300.                         // Create Label
  1301.                         objLblRemainingTime = new Label();
  1302.                         objLblRemainingTime.Left = 5;
  1303.                         objLblRemainingTime.Top = 85;
  1304.                         objLblRemainingTime.Width = 800 - 20;
  1305.                         objLblRemainingTime.Height = 16;
  1306.                         objLblRemainingTime.Text = "";
  1307.                         // Add Label to Form
  1308.                         this.Controls.Add(objLblRemainingTime);
  1309.  
  1310.                         // Create Label
  1311.                         objLblOperation = new Label();
  1312.                         objLblOperation.Left = 25;
  1313.                         objLblOperation.Top = 101;
  1314.                         objLblOperation.Width = 800 - 40;
  1315.                         objLblOperation.Height = 16;
  1316.                         objLblOperation.Text = "";
  1317.                         // Add Label to Form
  1318.                         this.Controls.Add(objLblOperation);
  1319.  
  1320.                         this.ResumeLayout();
  1321.                 }
  1322.  
  1323.                 public ProgressForm()
  1324.                 {
  1325.                         InitializeComponent();
  1326.                 }
  1327.  
  1328.                 public ProgressForm(ConsoleColor BarColor)
  1329.                 {
  1330.                         ProgressBarColor = BarColor;
  1331.                         InitializeComponent();
  1332.                 }
  1333.  
  1334.                 public void Update(ProgressRecord objRecord)
  1335.                 {
  1336.                         if (objRecord == null)
  1337.                                 return;
  1338.  
  1339.                         if (objRecord.RecordType == ProgressRecordType.Completed)
  1340.                         {
  1341.                                 this.Close();
  1342.                                 return;
  1343.                         }
  1344.  
  1345.                         if (!string.IsNullOrEmpty(objRecord.Activity))
  1346.                                 objLblActivity.Text = objRecord.Activity;
  1347.                         else
  1348.                                 objLblActivity.Text = "";
  1349.  
  1350.                         if (!string.IsNullOrEmpty(objRecord.StatusDescription))
  1351.                                 objLblStatus.Text = objRecord.StatusDescription;
  1352.                         else
  1353.                                 objLblStatus.Text = "";
  1354.  
  1355.                         if ((objRecord.PercentComplete >= 0) && (objRecord.PercentComplete <= 100))
  1356.                         {
  1357.                                 objProgressBar.Value = objRecord.PercentComplete;
  1358.                                 objProgressBar.Visible = true;
  1359.                         }
  1360.                         else
  1361.                         { if (objRecord.PercentComplete > 100)
  1362.                                 {
  1363.                                         objProgressBar.Value = 0;
  1364.                                         objProgressBar.Visible = true;
  1365.                                 }
  1366.                                 else
  1367.                                         objProgressBar.Visible = false;
  1368.                         }
  1369.  
  1370.                         if (objRecord.SecondsRemaining >= 0)
  1371.                         {
  1372.                                 System.TimeSpan objTimeSpan = new System.TimeSpan(0, 0, objRecord.SecondsRemaining);
  1373.                                 objLblRemainingTime.Text = "Remaining time: " + string.Format("{0:00}:{1:00}:{2:00}", (int)objTimeSpan.TotalHours, objTimeSpan.Minutes, objTimeSpan.Seconds);
  1374.                         }
  1375.                         else
  1376.                                 objLblRemainingTime.Text = "";
  1377.  
  1378.                         if (!string.IsNullOrEmpty(objRecord.CurrentOperation))
  1379.                                 objLblOperation.Text = objRecord.CurrentOperation;
  1380.                         else
  1381.                                 objLblOperation.Text = "";
  1382.  
  1383.                         this.Refresh();
  1384.                         Application.DoEvents();
  1385.                 }
  1386.         }
  1387. "@})
  1388.  
  1389.         // define IsInputRedirected(), IsOutputRedirected() and IsErrorRedirected() here since they were introduced first with .Net 4.5
  1390.         public class ConsoleInfo
  1391.         {
  1392.                 private enum FileType : uint
  1393.                 {
  1394.                         FILE_TYPE_UNKNOWN = 0x0000,
  1395.                         FILE_TYPE_DISK = 0x0001,
  1396.                         FILE_TYPE_CHAR = 0x0002,
  1397.                         FILE_TYPE_PIPE = 0x0003,
  1398.                         FILE_TYPE_REMOTE = 0x8000
  1399.                 }
  1400.  
  1401.                 private enum STDHandle : uint
  1402.                 {
  1403.                         STD_INPUT_HANDLE = unchecked((uint)-10),
  1404.                         STD_OUTPUT_HANDLE = unchecked((uint)-11),
  1405.                         STD_ERROR_HANDLE = unchecked((uint)-12)
  1406.                 }
  1407.  
  1408.                 [DllImport("Kernel32.dll")]
  1409.                 static private extern UIntPtr GetStdHandle(STDHandle stdHandle);
  1410.  
  1411.                 [DllImport("Kernel32.dll")]
  1412.                 static private extern FileType GetFileType(UIntPtr hFile);
  1413.  
  1414.                 static public bool IsInputRedirected()
  1415.                 {
  1416.                         UIntPtr hInput = GetStdHandle(STDHandle.STD_INPUT_HANDLE);
  1417.                         FileType fileType = (FileType)GetFileType(hInput);
  1418.                         if ((fileType == FileType.FILE_TYPE_CHAR) || (fileType == FileType.FILE_TYPE_UNKNOWN))
  1419.                                 return false;
  1420.                         return true;
  1421.                 }
  1422.  
  1423.                 static public bool IsOutputRedirected()
  1424.                 {
  1425.                         UIntPtr hOutput = GetStdHandle(STDHandle.STD_OUTPUT_HANDLE);
  1426.                         FileType fileType = (FileType)GetFileType(hOutput);
  1427.                         if ((fileType == FileType.FILE_TYPE_CHAR) || (fileType == FileType.FILE_TYPE_UNKNOWN))
  1428.                                 return false;
  1429.                         return true;
  1430.                 }
  1431.  
  1432.                 static public bool IsErrorRedirected()
  1433.                 {
  1434.                         UIntPtr hError = GetStdHandle(STDHandle.STD_ERROR_HANDLE);
  1435.                         FileType fileType = (FileType)GetFileType(hError);
  1436.                         if ((fileType == FileType.FILE_TYPE_CHAR) || (fileType == FileType.FILE_TYPE_UNKNOWN))
  1437.                                 return false;
  1438.                         return true;
  1439.                 }
  1440.         }
  1441.  
  1442.  
  1443.         internal class PS2EXEHostUI : PSHostUserInterface
  1444.         {
  1445.                 private PS2EXEHostRawUI rawUI = null;
  1446.  
  1447.                 public ConsoleColor ErrorForegroundColor = ConsoleColor.Red;
  1448.                 public ConsoleColor ErrorBackgroundColor = ConsoleColor.Black;
  1449.  
  1450.                 public ConsoleColor WarningForegroundColor = ConsoleColor.Yellow;
  1451.                 public ConsoleColor WarningBackgroundColor = ConsoleColor.Black;
  1452.  
  1453.                 public ConsoleColor DebugForegroundColor = ConsoleColor.Yellow;
  1454.                 public ConsoleColor DebugBackgroundColor = ConsoleColor.Black;
  1455.  
  1456.                 public ConsoleColor VerboseForegroundColor = ConsoleColor.Yellow;
  1457.                 public ConsoleColor VerboseBackgroundColor = ConsoleColor.Black;
  1458.  
  1459. $(if (!$noConsole) {@"
  1460.                 public ConsoleColor ProgressForegroundColor = ConsoleColor.Yellow;
  1461. "@ } else {@"
  1462.                 public ConsoleColor ProgressForegroundColor = ConsoleColor.DarkCyan;
  1463. "@ })
  1464.                 public ConsoleColor ProgressBackgroundColor = ConsoleColor.DarkCyan;
  1465.  
  1466.                 public PS2EXEHostUI() : base()
  1467.                 {
  1468.                         rawUI = new PS2EXEHostRawUI();
  1469. $(if (!$noConsole) {@"
  1470.                         rawUI.ForegroundColor = Console.ForegroundColor;
  1471.                         rawUI.BackgroundColor = Console.BackgroundColor;
  1472. "@ })
  1473.                 }
  1474.  
  1475.                 public override Dictionary<string, PSObject> Prompt(string caption, string message, System.Collections.ObjectModel.Collection<FieldDescription> descriptions)
  1476.                 {
  1477. $(if (!$noConsole) {@"
  1478.                         if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  1479.                         if (!string.IsNullOrEmpty(message)) WriteLine(message);
  1480. "@ } else {@"
  1481.                         if ((!string.IsNullOrEmpty(caption)) || (!string.IsNullOrEmpty(message)))
  1482.                         { string sTitel = System.AppDomain.CurrentDomain.FriendlyName, sMeldung = "";
  1483.  
  1484.                                 if (!string.IsNullOrEmpty(caption)) sTitel = caption;
  1485.                                 if (!string.IsNullOrEmpty(message)) sMeldung = message;
  1486.                                 MessageBox.Show(sMeldung, sTitel);
  1487.                         }
  1488.  
  1489.                         // Titel und Labeltext für Inputbox zurücksetzen
  1490.                         ibcaption = "";
  1491.                         ibmessage = "";
  1492. "@ })
  1493.                         Dictionary<string, PSObject> ret = new Dictionary<string, PSObject>();
  1494.                         foreach (FieldDescription cd in descriptions)
  1495.                         {
  1496.                                 Type t = null;
  1497.                                 if (string.IsNullOrEmpty(cd.ParameterAssemblyFullName))
  1498.                                         t = typeof(string);
  1499.                                 else
  1500.                                         t = Type.GetType(cd.ParameterAssemblyFullName);
  1501.  
  1502.                                 if (t.IsArray)
  1503.                                 {
  1504.                                         Type elementType = t.GetElementType();
  1505.                                         Type genericListType = Type.GetType("System.Collections.Generic.List"+((char)0x60).ToString()+"1");
  1506.                                         genericListType = genericListType.MakeGenericType(new Type[] { elementType });
  1507.                                         ConstructorInfo constructor = genericListType.GetConstructor(BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
  1508.                                         object resultList = constructor.Invoke(null);
  1509.  
  1510.                                         int index = 0;
  1511.                                         string data = "";
  1512.                                         do
  1513.                                         {
  1514.                                                 try
  1515.                                                 {
  1516. $(if (!$noConsole) {@"
  1517.                                                         if (!string.IsNullOrEmpty(cd.Name)) Write(string.Format("{0}[{1}]: ", cd.Name, index));
  1518. "@ } else {@"
  1519.                                                         if (!string.IsNullOrEmpty(cd.Name)) ibmessage = string.Format("{0}[{1}]: ", cd.Name, index);
  1520. "@ })
  1521.                                                         data = ReadLine();
  1522.                                                         if (string.IsNullOrEmpty(data))
  1523.                                                                 break;
  1524.  
  1525.                                                         object o = System.Convert.ChangeType(data, elementType);
  1526.                                                         genericListType.InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, resultList, new object[] { o });
  1527.                                                 }
  1528.                                                 catch (Exception e)
  1529.                                                 {
  1530.                                                         throw e;
  1531.                                                 }
  1532.                                                 index++;
  1533.                                         } while (true);
  1534.  
  1535.                                         System.Array retArray = (System.Array )genericListType.InvokeMember("ToArray", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, resultList, null);
  1536.                                         ret.Add(cd.Name, new PSObject(retArray));
  1537.                                 }
  1538.                                 else
  1539.                                 {
  1540.                                         object o = null;
  1541.                                         string l = null;
  1542.                                         try
  1543.                                         {
  1544.                                                 if (t != typeof(System.Security.SecureString))
  1545.                                                 {
  1546.                                                         if (t != typeof(System.Management.Automation.PSCredential))
  1547.                                                         {
  1548. $(if (!$noConsole) {@"
  1549.                                                                 if (!string.IsNullOrEmpty(cd.Name)) Write(cd.Name);
  1550.                                                                 if (!string.IsNullOrEmpty(cd.HelpMessage)) Write(" (Type !? for help.)");
  1551.                                                                 if ((!string.IsNullOrEmpty(cd.Name)) || (!string.IsNullOrEmpty(cd.HelpMessage))) Write(": ");
  1552. "@ } else {@"
  1553.                                                                 if (!string.IsNullOrEmpty(cd.Name)) ibmessage = string.Format("{0}: ", cd.Name);
  1554.                                                                 if (!string.IsNullOrEmpty(cd.HelpMessage)) ibmessage += "\n(Type !? for help.)";
  1555. "@ })
  1556.                                                                 do {
  1557.                                                                         l = ReadLine();
  1558.                                                                         if (l == "!?")
  1559.                                                                                 WriteLine(cd.HelpMessage);
  1560.                                                                         else
  1561.                                                                         {
  1562.                                                                                 if (string.IsNullOrEmpty(l)) o = cd.DefaultValue;
  1563.                                                                                 if (o == null)
  1564.                                                                                 {
  1565.                                                                                         try {
  1566.                                                                                                 o = System.Convert.ChangeType(l, t);
  1567.                                                                                         }
  1568.                                                                                         catch {
  1569.                                                                                                 Write("Wrong format, please repeat input: ");
  1570.                                                                                                 l = "!?";
  1571.                                                                                         }
  1572.                                                                                 }
  1573.                                                                         }
  1574.                                                                 } while (l == "!?");
  1575.                                                         }
  1576.                                                         else
  1577.                                                         {
  1578.                                                                 PSCredential pscred = PromptForCredential("", "", "", "");
  1579.                                                                 o = pscred;
  1580.                                                         }
  1581.                                                 }
  1582.                                                 else
  1583.                                                 {
  1584. $(if (!$noConsole) {@"
  1585.                                                                 if (!string.IsNullOrEmpty(cd.Name)) Write(string.Format("{0}: ", cd.Name));
  1586. "@ } else {@"
  1587.                                                                 if (!string.IsNullOrEmpty(cd.Name)) ibmessage = string.Format("{0}: ", cd.Name);
  1588. "@ })
  1589.  
  1590.                                                         SecureString pwd = null;
  1591.                                                         pwd = ReadLineAsSecureString();
  1592.                                                         o = pwd;
  1593.                                                 }
  1594.  
  1595.                                                 ret.Add(cd.Name, new PSObject(o));
  1596.                                         }
  1597.                                         catch (Exception e)
  1598.                                         {
  1599.                                                 throw e;
  1600.                                         }
  1601.                                 }
  1602.                         }
  1603. $(if ($noConsole) {@"
  1604.                         // Titel und Labeltext für Inputbox zurücksetzen
  1605.                         ibcaption = "";
  1606.                         ibmessage = "";
  1607. "@ })
  1608.                         return ret;
  1609.                 }
  1610.  
  1611.                 public override int PromptForChoice(string caption, string message, System.Collections.ObjectModel.Collection<ChoiceDescription> choices, int defaultChoice)
  1612.                 {
  1613. $(if ($noConsole) {@"
  1614.                         int iReturn = ChoiceBox.Show(choices, defaultChoice, caption, message);
  1615.                         if (iReturn == -1) { iReturn = defaultChoice; }
  1616.                         return iReturn;
  1617. "@ } else {@"
  1618.                         if (!string.IsNullOrEmpty(caption))
  1619.                                 WriteLine(caption);
  1620.                         WriteLine(message);
  1621.                         int idx = 0;
  1622.                         SortedList<string, int> res = new SortedList<string, int>();
  1623.                         foreach (ChoiceDescription cd in choices)
  1624.                         {
  1625.                                 string lkey = cd.Label.Substring(0, 1), ltext = cd.Label;
  1626.                                 int pos = cd.Label.IndexOf('&');
  1627.                                 if (pos > -1)
  1628.                                 {
  1629.                                         lkey = cd.Label.Substring(pos + 1, 1).ToUpper();
  1630.                                         if (pos > 0)
  1631.                                                 ltext = cd.Label.Substring(0, pos) + cd.Label.Substring(pos + 1);
  1632.                                         else
  1633.                                                 ltext = cd.Label.Substring(1);
  1634.                                 }
  1635.                                 res.Add(lkey.ToLower(), idx);
  1636.  
  1637.                                 if (idx > 0) Write("  ");
  1638.                                 if (idx == defaultChoice)
  1639.                                 {
  1640.                                         Write(ConsoleColor.Yellow, Console.BackgroundColor, string.Format("[{0}] {1}", lkey, ltext));
  1641.                                         if (!string.IsNullOrEmpty(cd.HelpMessage))
  1642.                                                 Write(ConsoleColor.Gray, Console.BackgroundColor, string.Format(" ({0})", cd.HelpMessage));
  1643.                                 }
  1644.                                 else
  1645.                                 {
  1646.                                         Write(ConsoleColor.Gray, Console.BackgroundColor, string.Format("[{0}] {1}", lkey, ltext));
  1647.                                         if (!string.IsNullOrEmpty(cd.HelpMessage))
  1648.                                                 Write(ConsoleColor.Gray, Console.BackgroundColor, string.Format(" ({0})", cd.HelpMessage));
  1649.                                 }
  1650.                                 idx++;
  1651.                         }
  1652.                         Write(": ");
  1653.  
  1654.                         try
  1655.                         {
  1656.                                 while (true)
  1657.                                 { string s = Console.ReadLine().ToLower();
  1658.                                         if (res.ContainsKey(s))
  1659.                                                 return res[s];
  1660.                                         if (string.IsNullOrEmpty(s))
  1661.                                                 return defaultChoice;
  1662.                                 }
  1663.                         }
  1664.                         catch { }
  1665.  
  1666.                         return defaultChoice;
  1667. "@ })
  1668.                 }
  1669.  
  1670.                 public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName, PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options)
  1671.                 {
  1672. $(if (!$noConsole -and !$credentialGUI) {@"
  1673.                         if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  1674.                         WriteLine(message);
  1675.  
  1676.                         string un;
  1677.                         if ((string.IsNullOrEmpty(userName)) || ((options & PSCredentialUIOptions.ReadOnlyUserName) == 0))
  1678.                         {
  1679.                                 Write("User name: ");
  1680.                                 un = ReadLine();
  1681.                         }
  1682.                         else
  1683.                         {
  1684.                                 Write("User name: ");
  1685.                                 if (!string.IsNullOrEmpty(targetName)) Write(targetName + "\\");
  1686.                                 WriteLine(userName);
  1687.                                 un = userName;
  1688.                         }
  1689.                         SecureString pwd = null;
  1690.                         Write("Password: ");
  1691.                         pwd = ReadLineAsSecureString();
  1692.  
  1693.                         if (string.IsNullOrEmpty(un)) un = "<NOUSER>";
  1694.                         if (!string.IsNullOrEmpty(targetName))
  1695.                         {
  1696.                                 if (un.IndexOf('\\') < 0)
  1697.                                         un = targetName + "\\" + un;
  1698.                         }
  1699.  
  1700.                         PSCredential c2 = new PSCredential(un, pwd);
  1701.                         return c2;
  1702. "@ } else {@"
  1703.                         ik.PowerShell.CredentialForm.UserPwd cred = CredentialForm.PromptForPassword(caption, message, targetName, userName, allowedCredentialTypes, options);
  1704.                         if (cred != null)
  1705.                         {
  1706.                                 System.Security.SecureString x = new System.Security.SecureString();
  1707.                                 foreach (char c in cred.Password.ToCharArray())
  1708.                                         x.AppendChar(c);
  1709.  
  1710.                                 return new PSCredential(cred.User, x);
  1711.                         }
  1712.                         return null;
  1713. "@ })
  1714.                 }
  1715.  
  1716.                 public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName)
  1717.                 {
  1718. $(if (!$noConsole -and !$credentialGUI) {@"
  1719.                         if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  1720.                         WriteLine(message);
  1721.  
  1722.                         string un;
  1723.                         if (string.IsNullOrEmpty(userName))
  1724.                         {
  1725.                                 Write("User name: ");
  1726.                                 un = ReadLine();
  1727.                         }
  1728.                         else
  1729.                         {
  1730.                                 Write("User name: ");
  1731.                                 if (!string.IsNullOrEmpty(targetName)) Write(targetName + "\\");
  1732.                                 WriteLine(userName);
  1733.                                 un = userName;
  1734.                         }
  1735.                         SecureString pwd = null;
  1736.                         Write("Password: ");
  1737.                         pwd = ReadLineAsSecureString();
  1738.  
  1739.                         if (string.IsNullOrEmpty(un)) un = "<NOUSER>";
  1740.                         if (!string.IsNullOrEmpty(targetName))
  1741.                         {
  1742.                                 if (un.IndexOf('\\') < 0)
  1743.                                         un = targetName + "\\" + un;
  1744.                         }
  1745.  
  1746.                         PSCredential c2 = new PSCredential(un, pwd);
  1747.                         return c2;
  1748. "@ } else {@"
  1749.                         ik.PowerShell.CredentialForm.UserPwd cred = CredentialForm.PromptForPassword(caption, message, targetName, userName, PSCredentialTypes.Default, PSCredentialUIOptions.Default);
  1750.                         if (cred != null)
  1751.                         {
  1752.                                 System.Security.SecureString x = new System.Security.SecureString();
  1753.                                 foreach (char c in cred.Password.ToCharArray())
  1754.                                         x.AppendChar(c);
  1755.  
  1756.                                 return new PSCredential(cred.User, x);
  1757.                         }
  1758.                         return null;
  1759. "@ })
  1760.                 }
  1761.  
  1762.                 public override PSHostRawUserInterface RawUI
  1763.                 {
  1764.                         get
  1765.                         {
  1766.                                 return rawUI;
  1767.                         }
  1768.                 }
  1769.  
  1770. $(if ($noConsole) {@"
  1771.                 private string ibcaption;
  1772.                 private string ibmessage;
  1773. "@ })
  1774.  
  1775.                 public override string ReadLine()
  1776.                 {
  1777. $(if (!$noConsole) {@"
  1778.                         return Console.ReadLine();
  1779. "@ } else {@"
  1780.                         string sWert = "";
  1781.                         if (InputBox.Show(ibcaption, ibmessage, ref sWert) == DialogResult.OK)
  1782.                                 return sWert;
  1783.                         else
  1784.                                 return "";
  1785. "@ })
  1786.                 }
  1787.  
  1788.                 private System.Security.SecureString getPassword()
  1789.                 {
  1790.                         System.Security.SecureString pwd = new System.Security.SecureString();
  1791.                         while (true)
  1792.                         {
  1793.                                 ConsoleKeyInfo i = Console.ReadKey(true);
  1794.                                 if (i.Key == ConsoleKey.Enter)
  1795.                                 {
  1796.                                         Console.WriteLine();
  1797.                                         break;
  1798.                                 }
  1799.                                 else if (i.Key == ConsoleKey.Backspace)
  1800.                                 {
  1801.                                         if (pwd.Length > 0)
  1802.                                         {
  1803.                                                 pwd.RemoveAt(pwd.Length - 1);
  1804.                                                 Console.Write("\b \b");
  1805.                                         }
  1806.                                 }
  1807.                                 else
  1808.                                 {
  1809.                                         pwd.AppendChar(i.KeyChar);
  1810.                                         Console.Write("*");
  1811.                                 }
  1812.                         }
  1813.                         return pwd;
  1814.                 }
  1815.  
  1816.                 public override System.Security.SecureString ReadLineAsSecureString()
  1817.                 {
  1818.                         System.Security.SecureString secstr = new System.Security.SecureString();
  1819. $(if (!$noConsole) {@"
  1820.                         secstr = getPassword();
  1821. "@ } else {@"
  1822.                         string sWert = "";
  1823.  
  1824.                         if (InputBox.Show(ibcaption, ibmessage, ref sWert, true) == DialogResult.OK)
  1825.                         {
  1826.                                 foreach (char ch in sWert)
  1827.                                         secstr.AppendChar(ch);
  1828.                         }
  1829. "@ })
  1830.                         return secstr;
  1831.                 }
  1832.  
  1833.                 // called by Write-Host
  1834.                 public override void Write(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
  1835.                 {
  1836. $(if (!$noConsole) {@"
  1837.                         ConsoleColor fgc = Console.ForegroundColor, bgc = Console.BackgroundColor;
  1838.                         Console.ForegroundColor = foregroundColor;
  1839.                         Console.BackgroundColor = backgroundColor;
  1840.                         Console.Write(value);
  1841.                         Console.ForegroundColor = fgc;
  1842.                         Console.BackgroundColor = bgc;
  1843. "@ } else {@"
  1844.                         if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  1845.                                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  1846. "@ })
  1847.                 }
  1848.  
  1849.                 public override void Write(string value)
  1850.                 {
  1851. $(if (!$noConsole) {@"
  1852.                         Console.Write(value);
  1853. "@ } else {@"
  1854.                         if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  1855.                                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  1856. "@ })
  1857.                 }
  1858.  
  1859.                 // called by Write-Debug
  1860.                 public override void WriteDebugLine(string message)
  1861.                 {
  1862. $(if (!$noConsole) {@"
  1863.                         WriteLine(DebugForegroundColor, DebugBackgroundColor, string.Format("DEBUG: {0}", message));
  1864. "@ } else {@"
  1865.                         MessageBox.Show(message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Information);
  1866. "@ })
  1867.                 }
  1868.  
  1869.                 // called by Write-Error
  1870.                 public override void WriteErrorLine(string value)
  1871.                 {
  1872. $(if (!$noConsole) {@"
  1873.                         if (ConsoleInfo.IsErrorRedirected())
  1874.                                 Console.Error.WriteLine(string.Format("ERROR: {0}", value));
  1875.                         else
  1876.                                 WriteLine(ErrorForegroundColor, ErrorBackgroundColor, string.Format("ERROR: {0}", value));
  1877. "@ } else {@"
  1878.                         MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  1879. "@ })
  1880.                 }
  1881.  
  1882.                 public override void WriteLine()
  1883.                 {
  1884. $(if (!$noConsole) {@"
  1885.                         Console.WriteLine();
  1886. "@ } else {@"
  1887.                         MessageBox.Show("", System.AppDomain.CurrentDomain.FriendlyName);
  1888. "@ })
  1889.                 }
  1890.  
  1891.                 public override void WriteLine(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
  1892.                 {
  1893. $(if (!$noConsole) {@"
  1894.                         ConsoleColor fgc = Console.ForegroundColor, bgc = Console.BackgroundColor;
  1895.                         Console.ForegroundColor = foregroundColor;
  1896.                         Console.BackgroundColor = backgroundColor;
  1897.                         Console.WriteLine(value);
  1898.                         Console.ForegroundColor = fgc;
  1899.                         Console.BackgroundColor = bgc;
  1900. "@ } else {@"
  1901.                         if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  1902.                                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  1903. "@ })
  1904.                 }
  1905.  
  1906.                 // called by Write-Output
  1907.                 public override void WriteLine(string value)
  1908.                 {
  1909. $(if (!$noConsole) {@"
  1910.                         Console.WriteLine(value);
  1911. "@ } else {@"
  1912.                         if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  1913.                                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  1914. "@ })
  1915.                 }
  1916.  
  1917. $(if ($noConsole) {@"
  1918.                 public ProgressForm pf = null;
  1919. "@ })
  1920.                 public override void WriteProgress(long sourceId, ProgressRecord record)
  1921.                 {
  1922. $(if ($noConsole) {@"
  1923.                         if (pf == null)
  1924.                         {
  1925.                                 pf = new ProgressForm(ProgressForegroundColor);
  1926.                                 pf.Show();
  1927.                         }
  1928.                         pf.Update(record);
  1929.                         if (record.RecordType == ProgressRecordType.Completed)
  1930.                         {
  1931.                                 pf = null;
  1932.                         }
  1933. "@ })
  1934.                 }
  1935.  
  1936.                 // called by Write-Verbose
  1937.                 public override void WriteVerboseLine(string message)
  1938.                 {
  1939. $(if (!$noConsole) {@"
  1940.                         WriteLine(VerboseForegroundColor, VerboseBackgroundColor, string.Format("VERBOSE: {0}", message));
  1941. "@ } else {@"
  1942.                         MessageBox.Show(message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Information);
  1943. "@ })
  1944.                 }
  1945.  
  1946.                 // called by Write-Warning
  1947.                 public override void WriteWarningLine(string message)
  1948.                 {
  1949. $(if (!$noConsole) {@"
  1950.                         WriteLine(WarningForegroundColor, WarningBackgroundColor, string.Format("WARNING: {0}", message));
  1951. "@ } else {@"
  1952.                         MessageBox.Show(message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  1953. "@ })
  1954.                 }
  1955.         }
  1956.  
  1957.         internal class PS2EXEHost : PSHost
  1958.         {
  1959.                 private PS2EXEApp parent;
  1960.                 private PS2EXEHostUI ui = null;
  1961.  
  1962.                 private CultureInfo originalCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
  1963.  
  1964.                 private CultureInfo originalUICultureInfo = System.Threading.Thread.CurrentThread.CurrentUICulture;
  1965.  
  1966.                 private Guid myId = Guid.NewGuid();
  1967.  
  1968.                 public PS2EXEHost(PS2EXEApp app, PS2EXEHostUI ui)
  1969.                 {
  1970.                         this.parent = app;
  1971.                         this.ui = ui;
  1972.                 }
  1973.  
  1974.                 public class ConsoleColorProxy
  1975.                 {
  1976.                         private PS2EXEHostUI _ui;
  1977.  
  1978.                         public ConsoleColorProxy(PS2EXEHostUI ui)
  1979.                         {
  1980.                                 if (ui == null) throw new ArgumentNullException("ui");
  1981.                                 _ui = ui;
  1982.                         }
  1983.  
  1984.                         public ConsoleColor ErrorForegroundColor
  1985.                         {
  1986.                                 get
  1987.                                 { return _ui.ErrorForegroundColor; }
  1988.                                 set
  1989.                                 { _ui.ErrorForegroundColor = value; }
  1990.                         }
  1991.  
  1992.                         public ConsoleColor ErrorBackgroundColor
  1993.                         {
  1994.                                 get
  1995.                                 { return _ui.ErrorBackgroundColor; }
  1996.                                 set
  1997.                                 { _ui.ErrorBackgroundColor = value; }
  1998.                         }
  1999.  
  2000.                         public ConsoleColor WarningForegroundColor
  2001.                         {
  2002.                                 get
  2003.                                 { return _ui.WarningForegroundColor; }
  2004.                                 set
  2005.                                 { _ui.WarningForegroundColor = value; }
  2006.                         }
  2007.  
  2008.                         public ConsoleColor WarningBackgroundColor
  2009.                         {
  2010.                                 get
  2011.                                 { return _ui.WarningBackgroundColor; }
  2012.                                 set
  2013.                                 { _ui.WarningBackgroundColor = value; }
  2014.                         }
  2015.  
  2016.                         public ConsoleColor DebugForegroundColor
  2017.                         {
  2018.                                 get
  2019.                                 { return _ui.DebugForegroundColor; }
  2020.                                 set
  2021.                                 { _ui.DebugForegroundColor = value; }
  2022.                         }
  2023.  
  2024.                         public ConsoleColor DebugBackgroundColor
  2025.                         {
  2026.                                 get
  2027.                                 { return _ui.DebugBackgroundColor; }
  2028.                                 set
  2029.                                 { _ui.DebugBackgroundColor = value; }
  2030.                         }
  2031.  
  2032.                         public ConsoleColor VerboseForegroundColor
  2033.                         {
  2034.                                 get
  2035.                                 { return _ui.VerboseForegroundColor; }
  2036.                                 set
  2037.                                 { _ui.VerboseForegroundColor = value; }
  2038.                         }
  2039.  
  2040.                         public ConsoleColor VerboseBackgroundColor
  2041.                         {
  2042.                                 get
  2043.                                 { return _ui.VerboseBackgroundColor; }
  2044.                                 set
  2045.                                 { _ui.VerboseBackgroundColor = value; }
  2046.                         }
  2047.  
  2048.                         public ConsoleColor ProgressForegroundColor
  2049.                         {
  2050.                                 get
  2051.                                 { return _ui.ProgressForegroundColor; }
  2052.                                 set
  2053.                                 { _ui.ProgressForegroundColor = value; }
  2054.                         }
  2055.  
  2056.                         public ConsoleColor ProgressBackgroundColor
  2057.                         {
  2058.                                 get
  2059.                                 { return _ui.ProgressBackgroundColor; }
  2060.                                 set
  2061.                                 { _ui.ProgressBackgroundColor = value; }
  2062.                         }
  2063.                 }
  2064.  
  2065.                 public override PSObject PrivateData
  2066.                 {
  2067.                         get
  2068.                         {
  2069.                                 if (ui == null) return null;
  2070.                                 return _consoleColorProxy ?? (_consoleColorProxy = PSObject.AsPSObject(new ConsoleColorProxy(ui)));
  2071.                         }
  2072.                 }
  2073.  
  2074.                 private PSObject _consoleColorProxy;
  2075.  
  2076.                 public override System.Globalization.CultureInfo CurrentCulture
  2077.                 {
  2078.                         get
  2079.                         {
  2080.                                 return this.originalCultureInfo;
  2081.                         }
  2082.                 }
  2083.  
  2084.                 public override System.Globalization.CultureInfo CurrentUICulture
  2085.                 {
  2086.                         get
  2087.                         {
  2088.                                 return this.originalUICultureInfo;
  2089.                         }
  2090.                 }
  2091.  
  2092.                 public override Guid InstanceId
  2093.                 {
  2094.                         get
  2095.                         {
  2096.                                 return this.myId;
  2097.                         }
  2098.                 }
  2099.  
  2100.                 public override string Name
  2101.                 {
  2102.                         get
  2103.                         {
  2104.                                 return "PS2EXE_Host";
  2105.                         }
  2106.                 }
  2107.  
  2108.                 public override PSHostUserInterface UI
  2109.                 {
  2110.                         get
  2111.                         {
  2112.                                 return ui;
  2113.                         }
  2114.                 }
  2115.  
  2116.                 public override Version Version
  2117.                 {
  2118.                         get
  2119.                         {
  2120.                                 return new Version(0, 5, 0, 13);
  2121.                         }
  2122.                 }
  2123.  
  2124.                 public override void EnterNestedPrompt()
  2125.                 {
  2126.                 }
  2127.  
  2128.                 public override void ExitNestedPrompt()
  2129.                 {
  2130.                 }
  2131.  
  2132.                 public override void NotifyBeginApplication()
  2133.                 {
  2134.                         return;
  2135.                 }
  2136.  
  2137.                 public override void NotifyEndApplication()
  2138.                 {
  2139.                         return;
  2140.                 }
  2141.  
  2142.                 public override void SetShouldExit(int exitCode)
  2143.                 {
  2144.                         this.parent.ShouldExit = true;
  2145.                         this.parent.ExitCode = exitCode;
  2146.                 }
  2147.         }
  2148.  
  2149.         internal interface PS2EXEApp
  2150.         {
  2151.                 bool ShouldExit { get; set; }
  2152.                 int ExitCode { get; set; }
  2153.         }
  2154.  
  2155.         internal class PS2EXE : PS2EXEApp
  2156.         {
  2157.                 private bool shouldExit;
  2158.  
  2159.                 private int exitCode;
  2160.  
  2161.                 public bool ShouldExit
  2162.                 {
  2163.                         get { return this.shouldExit; }
  2164.                         set { this.shouldExit = value; }
  2165.                 }
  2166.  
  2167.                 public int ExitCode
  2168.                 {
  2169.                         get { return this.exitCode; }
  2170.                         set { this.exitCode = value; }
  2171.                 }
  2172.  
  2173.                 $(if ($Sta){"[STAThread]"})$(if ($Mta){"[MTAThread]"})
  2174.                 private static int Main(string[] args)
  2175.                 {
  2176.                         $culture
  2177.  
  2178.                         PS2EXE me = new PS2EXE();
  2179.  
  2180.                         bool paramWait = false;
  2181.                         string extractFN = string.Empty;
  2182.  
  2183.                         PS2EXEHostUI ui = new PS2EXEHostUI();
  2184.                         PS2EXEHost host = new PS2EXEHost(me, ui);
  2185.                         System.Threading.ManualResetEvent mre = new System.Threading.ManualResetEvent(false);
  2186.  
  2187.                         AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  2188.  
  2189.                         try
  2190.                         {
  2191.                                 using (Runspace myRunSpace = RunspaceFactory.CreateRunspace(host))
  2192.                                 {
  2193.                                         $(if ($Sta -or $Mta) {"myRunSpace.ApartmentState = System.Threading.ApartmentState."})$(if ($Sta){"STA"})$(if ($Mta){"MTA"});
  2194.                                         myRunSpace.Open();
  2195.  
  2196.                                         using (System.Management.Automation.PowerShell powershell = System.Management.Automation.PowerShell.Create())
  2197.                                         {
  2198. $(if (!$noConsole) {@"
  2199.                                                 Console.CancelKeyPress += new ConsoleCancelEventHandler(delegate(object sender, ConsoleCancelEventArgs e)
  2200.                                                 {
  2201.                                                         try
  2202.                                                         {
  2203.                                                                 powershell.BeginStop(new AsyncCallback(delegate(IAsyncResult r)
  2204.                                                                 {
  2205.                                                                         mre.Set();
  2206.                                                                         e.Cancel = true;
  2207.                                                                 }), null);
  2208.                                                         }
  2209.                                                         catch
  2210.                                                         {
  2211.                                                         };
  2212.                                                 });
  2213. "@ })
  2214.  
  2215.                                                 powershell.Runspace = myRunSpace;
  2216.                                                 powershell.Streams.Error.DataAdded += new EventHandler<DataAddedEventArgs>(delegate(object sender, DataAddedEventArgs e)
  2217.                                                 {
  2218.                                                         ui.WriteErrorLine(((PSDataCollection<ErrorRecord>)sender)[e.Index].ToString());
  2219.                                                 });
  2220.  
  2221.                                                 PSDataCollection<string> colInput = new PSDataCollection<string>();
  2222. $(if (!$runtime20) {@"
  2223.                                                 if (ConsoleInfo.IsInputRedirected())
  2224.                                                 { // read standard input
  2225.                                                         string sItem = "";
  2226.                                                         while ((sItem = Console.ReadLine()) != null)
  2227.                                                         { // add to powershell pipeline
  2228.                                                                 colInput.Add(sItem);
  2229.                                                         }
  2230.                                                 }
  2231. "@ })
  2232.                                                 colInput.Complete();
  2233.  
  2234.                                                 PSDataCollection<PSObject> colOutput = new PSDataCollection<PSObject>();
  2235.                                                 colOutput.DataAdded += new EventHandler<DataAddedEventArgs>(delegate(object sender, DataAddedEventArgs e)
  2236.                                                 {
  2237.                                                         ui.WriteLine(colOutput[e.Index].ToString());
  2238.                                                 });
  2239.  
  2240.                                                 int separator = 0;
  2241.                                                 int idx = 0;
  2242.                                                 foreach (string s in args)
  2243.                                                 {
  2244.                                                         if (string.Compare(s, "-wait", true) == 0)
  2245.                                                                 paramWait = true;
  2246.                                                         else if (s.StartsWith("-extract", StringComparison.InvariantCultureIgnoreCase))
  2247.                                                         {
  2248.                                                                 string[] s1 = s.Split(new string[] { ":" }, 2, StringSplitOptions.RemoveEmptyEntries);
  2249.                                                                 if (s1.Length != 2)
  2250.                                                                 {
  2251. $(if (!$noConsole) {@"
  2252.                                                                         Console.WriteLine("If you specify the -extract option you need to add a file for extraction in this way\r\n   -extract:\"<filename>\"");
  2253. "@ } else {@"
  2254.                                                                         MessageBox.Show("If you specify the -extract option you need to add a file for extraction in this way\r\n   -extract:\"<filename>\"", System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  2255. "@ })
  2256.                                                                         return 1;
  2257.                                                                 }
  2258.                                                                 extractFN = s1[1].Trim(new char[] { '\"' });
  2259.                                                         }
  2260.                                                         else if (string.Compare(s, "-end", true) == 0)
  2261.                                                         {
  2262.                                                                 separator = idx + 1;
  2263.                                                                 break;
  2264.                                                         }
  2265.                                                         else if (string.Compare(s, "-debug", true) == 0)
  2266.                                                         {
  2267.                                                                 System.Diagnostics.Debugger.Launch();
  2268.                                                                 break;
  2269.                                                         }
  2270.                                                         idx++;
  2271.                                                 }
  2272.  
  2273.                                                 string script = System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(@"$($script)"));
  2274.  
  2275.                                                 if (!string.IsNullOrEmpty(extractFN))
  2276.                                                 {
  2277.                                                         System.IO.File.WriteAllText(extractFN, script);
  2278.                                                         return 0;
  2279.                                                 }
  2280.  
  2281.                                                 powershell.AddScript(script);
  2282.  
  2283.                                                 // parse parameters
  2284.                                                 string argbuffer = null;
  2285.                                                 // regex for named parameters
  2286.                                                 System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^-([^: ]+)[ :]?([^:]*)$");
  2287.  
  2288.                                                 for (int i = separator; i < args.Length; i++)
  2289.                                                 {
  2290.                                                         System.Text.RegularExpressions.Match match = regex.Match(args[i]);
  2291.                                                         if (match.Success && match.Groups.Count == 3)
  2292.                                                         { // parameter in powershell style, means named parameter found
  2293.                                                                 if (argbuffer != null) // already a named parameter in buffer, then flush it
  2294.                                                                         powershell.AddParameter(argbuffer);
  2295.  
  2296.                                                                 if (match.Groups[2].Value.Trim() == "")
  2297.                                                                 { // store named parameter in buffer
  2298.                                                                         argbuffer = match.Groups[1].Value;
  2299.                                                                 }
  2300.                                                                 else
  2301.                                                                         // caution: when called in powershell $TRUE gets converted, when called in cmd.exe not
  2302.                                                                         if ((match.Groups[2].Value == "$TRUE") || (match.Groups[2].Value.ToUpper() == "\x24TRUE"))
  2303.                                                                         { // switch found
  2304.                                                                                 powershell.AddParameter(match.Groups[1].Value, true);
  2305.                                                                                 argbuffer = null;
  2306.                                                                         }
  2307.                                                                         else
  2308.                                                                                 // caution: when called in powershell $FALSE gets converted, when called in cmd.exe not
  2309.                                                                                 if ((match.Groups[2].Value == "$FALSE") || (match.Groups[2].Value.ToUpper() == "\x24"+"FALSE"))
  2310.                                                                                 { // switch found
  2311.                                                                                         powershell.AddParameter(match.Groups[1].Value, false);
  2312.                                                                                         argbuffer = null;
  2313.                                                                                 }
  2314.                                                                                 else
  2315.                                                                                 { // named parameter with value found
  2316.                                                                                         powershell.AddParameter(match.Groups[1].Value, match.Groups[2].Value);
  2317.                                                                                         argbuffer = null;
  2318.                                                                                 }
  2319.                                                         }
  2320.                                                         else
  2321.                                                         { // unnamed parameter found
  2322.                                                                 if (argbuffer != null)
  2323.                                                                 { // already a named parameter in buffer, so this is the value
  2324.                                                                         powershell.AddParameter(argbuffer, args[i]);
  2325.                                                                         argbuffer = null;
  2326.                                                                 }
  2327.                                                                 else
  2328.                                                                 { // position parameter found
  2329.                                                                         powershell.AddArgument(args[i]);
  2330.                                                                 }
  2331.                                                         }
  2332.                                                 }
  2333.  
  2334.                                                 if (argbuffer != null) powershell.AddParameter(argbuffer); // flush parameter buffer...
  2335.  
  2336.                                                 // convert output to strings
  2337.                                                 powershell.AddCommand("out-string");
  2338.                                                 // with a single string per line
  2339.                                                 powershell.AddParameter("stream");
  2340.  
  2341.                                                 powershell.BeginInvoke<string, PSObject>(colInput, colOutput, null, new AsyncCallback(delegate(IAsyncResult ar)
  2342.                                                 {
  2343.                                                         if (ar.IsCompleted)
  2344.                                                                 mre.Set();
  2345.                                                 }), null);
  2346.  
  2347.                                                 while (!me.ShouldExit && !mre.WaitOne(100))
  2348.                                                 { };
  2349.  
  2350.                                                 powershell.Stop();
  2351.  
  2352.                                                 if (powershell.InvocationStateInfo.State == PSInvocationState.Failed)
  2353.                                                         ui.WriteErrorLine(powershell.InvocationStateInfo.Reason.Message);
  2354.                                         }
  2355.  
  2356.                                         myRunSpace.Close();
  2357.                                 }
  2358.                         }
  2359.                         catch (Exception ex)
  2360.                         {
  2361. $(if (!$noConsole) {@"
  2362.                                 Console.Write("An exception occured: ");
  2363.                                 Console.WriteLine(ex.Message);
  2364. "@ } else {@"
  2365.                                 MessageBox.Show("An exception occured: " + ex.Message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  2366. "@ })
  2367.                         }
  2368.  
  2369.                         if (paramWait)
  2370.                         {
  2371. $(if (!$noConsole) {@"
  2372.                                 Console.WriteLine("Hit any key to exit...");
  2373.                                 Console.ReadKey();
  2374. "@ } else {@"
  2375.                                 MessageBox.Show("Click OK to exit...", System.AppDomain.CurrentDomain.FriendlyName);
  2376. "@ })
  2377.                         }
  2378.                         return me.ExitCode;
  2379.                 }
  2380.  
  2381.                 static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
  2382.                 {
  2383.                         throw new Exception("Unhandled exception in PS2EXE");
  2384.                 }
  2385.         }
  2386. }
  2387. "@
  2388. #endregion
  2389.  
  2390. $configFileForEXE2 = "<?xml version=""1.0"" encoding=""utf-8"" ?>`r`n<configuration><startup><supportedRuntime version=""v2.0.50727""/></startup></configuration>"
  2391. $configFileForEXE3 = "<?xml version=""1.0"" encoding=""utf-8"" ?>`r`n<configuration><startup><supportedRuntime version=""v4.0"" sku="".NETFramework,Version=v4.0"" /></startup></configuration>"
  2392.  
  2393. Write-Host "Compiling file... " -NoNewline
  2394. $cr = $cop.CompileAssemblyFromSource($cp, $programFrame)
  2395. if ($cr.Errors.Count -gt 0)
  2396. {
  2397.         Write-Host ""
  2398.         Write-Host ""
  2399.         if (Test-Path $outputFile)
  2400.         {
  2401.                 Remove-Item $outputFile -Verbose:$FALSE
  2402.         }
  2403.         Write-Host -ForegroundColor red "Could not create the PowerShell .exe file because of compilation errors. Use -verbose parameter to see details."
  2404.         $cr.Errors | % { Write-Verbose $_ -Verbose:$verbose}
  2405. }
  2406. else
  2407. {
  2408.         Write-Host ""
  2409.         Write-Host ""
  2410.         if (Test-Path $outputFile)
  2411.         {
  2412.                 Write-Host "Output file " -NoNewline
  2413.                 Write-Host $outputFile -NoNewline
  2414.                 Write-Host " written"
  2415.  
  2416.                 if ($debug)
  2417.                 {
  2418.                         $cr.TempFiles | ? { $_ -ilike "*.cs" } | select -first 1 | % {
  2419.                                 $dstSrc = ([System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($outputFile), [System.IO.Path]::GetFileNameWithoutExtension($outputFile)+".cs"))
  2420.                                 Write-Host "Source file name for debug copied: $($dstSrc)"
  2421.                                 Copy-Item -Path $_ -Destination $dstSrc -Force
  2422.                         }
  2423.                         $cr.TempFiles | Remove-Item -Verbose:$FALSE -Force -ErrorAction SilentlyContinue
  2424.                 }
  2425.                 if (!$noConfigfile)
  2426.                 {
  2427.                         if ($runtime20)
  2428.                         {
  2429.                                 $configFileForEXE2 | Set-Content ($outputFile+".config") -Encoding UTF8
  2430.                                 Write-Host "Config file for EXE created."
  2431.                         }
  2432.                         if ($runtime40)
  2433.                         {
  2434.                                 $configFileForEXE3 | Set-Content ($outputFile+".config") -Encoding UTF8
  2435.                                 Write-Host "Config file for EXE created."
  2436.                         }
  2437.                 }
  2438.         }
  2439.         else
  2440.         {
  2441.                 Write-Host "Output file " -NoNewline -ForegroundColor Red
  2442.                 Write-Host $outputFile -ForegroundColor Red -NoNewline
  2443.                 Write-Host " not written" -ForegroundColor Red
  2444.         }
  2445. }
  2446.  
  2447. if ($requireAdmin)
  2448. { if (Test-Path $($outputFile+".win32manifest"))
  2449.         {
  2450.                 Remove-Item $($outputFile+".win32manifest") -Verbose:$FALSE
  2451.         }
  2452. }
  2453.