Skip to content

Instantly share code, notes, and snippets.

View PanosGreg's full-sized avatar

Panos Grigoriadis PanosGreg

  • Dublin, Ireland
View GitHub Profile
@PanosGreg
PanosGreg / Start-RunspaceJob.ps1
Last active May 27, 2025 07:41
Run a scriptblock in a timer using a runspace
function Start-RunspaceJob {
<#
.SYNOPSIS
It runs a command on a timer, so it can abort the command if the timeout expires.
It can also run the command as a different user.
It allows the end-user to pass input parameters to the command.
.EXAMPLE
Start-RunspaceJob -Scriptblock {
$p1 = ' ' * 9 ; $p2 = ' ' * 18
Write-Verbose "$p1 1 [V] Will do A" -Verbose
@PanosGreg
PanosGreg / Get-AmazonApiOperation.ps1
Created May 9, 2025 08:45
Get the relevant AWS API Operation for a given PowerShell command
function Get-AmazonApiOperation {
<#
.SYNOPSIS
Show the relevant AWS API Operation for a given PowerShell command
.DESCRIPTION
This function comes handy when writing permissions for IAM roles.
Because you need to know the actions (as-in API operations) that you want to allow in the IAM policy.
.EXAMPLE
Get-Command -Noun EC2Tag | Get-AmazonApiOperation
@PanosGreg
PanosGreg / Test-PasswordComplexity.ps1
Last active April 24, 2025 17:08
Check if a password meets a minimum required complexity
function Test-PasswordComplexity {
<#
.SYNOPSIS
It checks if a password meets the minimum required password complexity
.EXAMPLE
Test-PasswordComplexity -Password 123asdASD -MinComplex 2 -MinLength 6 -MinUpper 2 -MinLower 2 -MinDigits 2 -MinSpecial 2
Returns True. Because the password is more than 6 characters long. It is actually 9 characters long.
And it has more than 2 different character types. Namely it has lower, upper and numbers which are 3 different types.
And out of those character types is has the minimum number of characters required for each type.
@PanosGreg
PanosGreg / Split-ByGroup.ps1
Created March 18, 2025 22:23
Split an array into chunks and return a number of arrays based on a group size.
function Split-ByGroup {
<#
.SYNOPSIS
It will split an array into chunks and return a number of arrays based on a group size
.EXAMPLE
# first create a sample array (I'm using the RNG class here to do that)
$ArraySize = 160
$Array = [byte[]]::new($ArraySize)
$rng = [Security.Cryptography.RandomNumberGenerator]::Create()
$rng.GetBytes($Array)
@PanosGreg
PanosGreg / Disable-WingetPinning.ps1
Last active March 18, 2025 09:41
Disable WinGet certificate pinning for the MS Store source
function Disable-WingetPinning {
<#
.SYNOPSIS
It disables the Certificate Pinning option in WinGet for the MS Store source.
This is usually required when there is a firewall on your network that inspects SSL traffic,
where you might get an error 0x8a15005e back from WinGet, as it cannot access the msstore endpoint URL.
.DESCRIPTION
If you are behind a firewall that inspects SSL traffic,
that means it decrypts & re-encrypts traffic on the fly in order to inspect it.
@PanosGreg
PanosGreg / Sorting-IComparer.ps1
Created February 24, 2025 13:27
How to make a custom type sortable in PowerShell (with IComparer)
# How to make a custom type sortable
# There are 2 ways to make a type sortable
#
# 1) you can inherit from the IComparable interface [System.IComparable]
# where you will compare based on a predefined property of the object
# and you need to implement the CompareTo() method
#
# 2) you can create a custom Comparer type that will inherit from the IComparer interface [System.Collections.Generic.IComparer[T]]
@PanosGreg
PanosGreg / NewRelic.ps1
Last active February 11, 2025 18:58
New Relic functions for Synthetic Monitors (enable/disable, get) and API Keys (get)
# change this Enum with your actual accounts and their IDs
enum NewRelicAccountName {
NRAcc1 = 300000
NRAcc2 = 400000
NRAcc3 = 500000
NRAcc4 = 600000
}
function Get-NRMonitor {
@PanosGreg
PanosGreg / Get-DurationText.ps1
Created December 26, 2024 12:05
Get the elapsed duration as a string
function Get-DurationText {
<#
.SYNOPSIS
Get the elapsed duration as a string, in a number of different formats
.EXAMPLE
Get-DurationText -Duration ([timespan]::FromDays(2))
2d 0hr
#>
[CmdletBinding(DefaultParameterSetName='Timespan')]
[OutputType([string])]
@PanosGreg
PanosGreg / Encryption-Decryption_AES128-AES256.ps1
Last active December 10, 2024 16:14
Encryption-Decryption with and without .NET streams & Key Generation with PBKDF
# I wrote these notes in Sep-2024
# AES 128 and 256 bits
# Without using .NET Streams
## Initial Input
[string]$PlainText = 'this is a test message'
[string]$Password = 'SampleSecret'
@PanosGreg
PanosGreg / Get-ArgumentCompleter.ps1
Last active October 22, 2024 20:32
Get the argument completers that are registered in the current session (if any)
function Get-ArgumentCompleter {
<#
.SYNOPSIS
Get the argument completers that are registered in the current session (if any)
.EXAMPLE
Import-Module PowerShellGet
Get-ArgumentCompleter
shows the argument completers that are registered from the PowerShellGet module
.EXAMPLE