function keepalive(){ $wsh = New-Object -ComObject wscript.shell $i = 0 $interval = 200 while($true){ Write-Host "`t$i" -NoNewline $i = $i + $interval sleep -Seconds $interval $wsh.SendKeys("{F14}") } }
Scripting Hell
Monday 25 October 2021
Keep alive
Tuesday 9 September 2014
Wednesday 20 February 2013
Passing an array to invoke-command
When passing an array to invoke-command to be used on a remove machine, the PARAM will only read the first entry if passed as below:
Result:
a
1
To read in the array correctly, use the syntax (,$myArray)
Result:
a b c
3
$ar = @("a","b","c") invoke-command -ArgumentList $ar -ComputerName mypc1 -ScriptBlock {param($opts);write-host $opts;write-host $opts.length}
Result:
a
1
To read in the array correctly, use the syntax (,$myArray)
$ar = @("a","b","c") invoke-command -ArgumentList (,$ar) -ComputerName mypc1 -ScriptBlock {param($opts);write-host $opts;write-host $opts.count}
Result:
a b c
3
Monday 22 October 2012
Ternary Operator support in Powershell
It's always bugged me that Powershell had no support for Ternary Operators as with C# or Java/JavaScript.
e.g.:
Fortunately, there is a way however it doesn't use the usual ?: notation:
It's also possible to call a function from within the query:
e.g.:
var a = (b == 1)?true:false;
Fortunately, there is a way however it doesn't use the usual ?: notation:
$a = 4 @{$true=1;$false=0}[$a -lt 5]
It's also possible to call a function from within the query:
function retValue($ret){ return " "+$ret } $b = 0 $a = @{$true=retValue "FOO!";$false=retValue "BAR!"}[$b -eq 1]
Tuesday 9 October 2012
Creating a Powershell Module in C#
I'd like to take the SHA1Crypt powershell script I posted yesterday and create a C# module - it was a lot easier than I thought:
Import the module in the usual way:
As an alternative to passing the passKey as a parameter, if it's not likely to change, add it to your module as bytes (NB a string can be viewed by opening the dll in Notepad!! Bytes are more tricky to work out ;) )
Nice advantage is you can reuse the exact same code + key in an ASP.NET page for administrative purposes.
- Create the usual windows class Library Project
- Change the project to .NET Framework 3.5. If you leave as .NET 4, you will need to force powershell to start using .NET4 (default is 2.0.5 viewed with [environment]::Version)
- Add following references:
- System.Management
- System.Security
- System.Management.Automation - Download Powershell 2.0 SDK (PowerShellV2_SDK_Samples.msi) from http://www.microsoft.com/en-us/download/details.aspx?id=2560
- Remove the default public class Class1
- Create your classes as below:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace SHA1Crypt { [System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Get, "Encrypted")] public class Encrypt : System.Management.Automation.PSCmdlet { [System.Management.Automation.Parameter(Position = 0, Mandatory = true, HelpMessage = "String to be encrypted")] public string PlainString; [System.Management.Automation.Parameter(Position = 1, Mandatory = true, HelpMessage = "Pass Key should be the same as used to encrypt if decrypting")] public string passKey; protected override void ProcessRecord() { byte[] Results; System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); SHA1CryptoServiceProvider HashProvider = new SHA1CryptoServiceProvider(); byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(passKey)); byte[] key = new byte[24]; TDESKey.CopyTo(key, 0); TDESAlgorithm.Key = key; TDESAlgorithm.Mode = CipherMode.ECB; TDESAlgorithm.Padding = PaddingMode.PKCS7; byte[] DataToEncrypt = UTF8.GetBytes(PlainString); try { ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor(); Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length); } finally { TDESAlgorithm.Clear(); HashProvider.Clear(); } this.WriteObject(Convert.ToBase64String(Results), true); } } [System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Get, "Decrypted")] public class Decrypt : System.Management.Automation.PSCmdlet { [System.Management.Automation.Parameter(Position = 0, Mandatory = true, HelpMessage = "Encrypted string to be decrypted")] public string EncryptedString; [System.Management.Automation.Parameter(Position = 1, Mandatory = true, HelpMessage = "Pass Key should be the same as used to encrypt if decrypting")] public string passKey; protected override void ProcessRecord() { byte[] Results; System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); SHA1CryptoServiceProvider HashProvider = new SHA1CryptoServiceProvider(); byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(passKey)); byte[] key = new byte[24]; TDESKey.CopyTo(key, 0); TDESAlgorithm.Key = key; TDESAlgorithm.Mode = CipherMode.ECB; TDESAlgorithm.Padding = PaddingMode.PKCS7; byte[] DataToDecrypt = Convert.FromBase64String(EncryptedString); try { ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); } finally { TDESAlgorithm.Clear(); HashProvider.Clear(); } this.WriteObject(UTF8.GetString(Results), true); } } }
Import the module in the usual way:
Import-Module .\SHA1Crypt.dll Get-Module ModuleType Name ExportedCommands ---------- ---- ---------------- Binary SHA1Crypt {Get-Decrypted, Get-Encrypted} Get-Encrypted -PlainString woohoo -passKey thisismykey xhWWiEyQDhs= Get-Decrypted -EncryptedString xhWWiEyQDhs= -passKey thisismykey woohoo
As an alternative to passing the passKey as a parameter, if it's not likely to change, add it to your module as bytes (NB a string can be viewed by opening the dll in Notepad!! Bytes are more tricky to work out ;) )
Nice advantage is you can reuse the exact same code + key in an ASP.NET page for administrative purposes.
Monday 8 October 2012
Use SHA1 Crypto provider to create a Hash of a pass key to tripledes encrypt/decrypt a string:
param( [parameter(Mandatory = $true, HelpMessage = "Action type: e.g. Encrypt(E)/Decrypt(D)")] [string] $Action, [parameter(Mandatory = $true, HelpMessage = "Pass Key should be the same as used to encrypt if decrypting")] [string] $passKey, [parameter(Mandatory = $true, HelpMessage = "String to be encrypted or decrypted")] [string] $message ) [System.Reflection.Assembly]::LoadWithPartialName('System.Security.Cryptography') [System.Reflection.Assembly]::LoadWithPartialName('System.Collections.Generic') [System.Reflection.Assembly]::LoadWithPartialName('System.Text') $HashProvider = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider $TDESAlgorithm = New-Object System.Security.Cryptography.TripleDESCryptoServiceProvider [Byte[]] $TDESKey = $HashProvider.ComputeHash([System.Text.UTF8Encoding]::UTF8.GetBytes($passKey)); $keyByte = New-Object byte[] 24 $TDESKey.CopyTo($keyByte, 0); $TDESAlgorithm.Key = $keyByte $TDESAlgorithm.Mode = [System.Security.Cryptography.CipherMode]::ECB $TDESAlgorithm.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 switch -regex ($Action.toLower()){ "d(ecrypt)?"{ try{ [Byte[]] $DataToDecrypt = [convert]::FromBase64String($Message) $Decryptor = $TDESAlgorithm.CreateDecryptor() $Results = $Decryptor.TransformFinalBlock($DataToDecrypt, 0, $DataToDecrypt.Length) }finally{ $TDESAlgorithm.Clear() $HashProvider.Clear() } return [System.Text.UTF8Encoding]::UTF8.GetString($Results) } "e(ncrypt)?"{ [Byte[]] $DataToEncrypt = [System.Text.UTF8Encoding]::UTF8.GetBytes($Message) try{ $Encryptor = $TDESAlgorithm.CreateEncryptor(); $Results = $Encryptor.TransformFinalBlock($DataToEncrypt, 0, $DataToEncrypt.Length); }finally{ $TDESAlgorithm.Clear(); $HashProvider.Clear(); } return [Convert]::ToBase64String($Results) } } <# .SYNOPSIS Encrypt or Decrypt strings with a pass key .DESCRIPTION Uses SHA1 Crypto provider to create a Hash of a pass key to tripledes encrypt/decrypt a string EDIT HISTORY: 08/10/2012 v1.0 Initial Release .PARAMETER Action Choose to Encrypt (E) or Decrypt (D) .PARAMETER passKey Pass key to be used to encrypt or decrypt a string .PARAMETER message String to be encrypted or decrypted .INPUTS None. .OUTPUTS Returns string .EXAMPLE PS > .\SHA1Crypt.ps1 -Action e -message testmessage -passKey thisismykey1 .EXAMPLE PS > .\SHA1Crypt.ps1 -Action Decrypt -message "IZTkBEuz6JbWvBlNQaN2wA==" -passKey thisismykey1 #>
Monday 24 September 2012
Found some useful code to assist with embedding images as Base64. Outputs element style tag as well as image element:
function retBase64Image($path){ $newImg = [convert]::ToBase64String((get-content $path -encoding byte)) $ext = gci $path | select @{Name="Ext";Expression={$_.Extension.substring(1)}} | select -ExpandProperty Ext Write-Host "style='background:url(data:image/$ext;base64,$newImg) right bottom no-repeat'" Write-Host "<img src='data:image/$ext;base64,$newImg' />" } retBase64Image -path "C:\MyImages\Image1.gif"
Subscribe to:
Posts (Atom)