I want to run nested powershell script block, with complex type arguments. I want to pass parameters to powershell scriptblock trough encoded command and encoded arguments.
I`m trying this script.
$text = "This is a test message."
$Cred = get-credential 'alex'
$Arguments = #{
Msg = $Text
Proc = $PID
Cred = $Cred
}
$Serialized = [System.Management.Automation.PSSerializer]::Serialize($Arguments)
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Serialized)
$EncodedArguments = [Convert]::ToBase64String($Bytes)
$ScriptBlock = {
param([String]$Base64)
$Serialized = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($Base64))
$Arguments = [System.Management.Automation.PSSerializer]::Deserialize($Serialized)
Write-Host " $($Arguments.msg) FROM PID: $($Arguments.proc), cred: $( $Arguments.Cred.Username)"
}
$Bytes = [System.Text.Encoding]::Unicode.GetBytes( $ScriptBlock.ToString() )
$EncodedCommand = [Convert]::ToBase64String( $Bytes )
Start-Process -FilePath powershell -ArgumentList '-noprofile', '-noexit', `
'-EncodedCommand', $EncodedCommand, '-EncodedArguments', $EncodedArguments
Powershell process flashing, then closing.
Help me to correct this script.
PS. Why stack overflow editor replace the header of my message 'Hello team!' ? Its all right on preview.
A -EncodedArguments parameter (or something alike) doesn't exist, therefore I would simply embed your arguments as a default param value in your (encoded) scriptblock:
$Arguments = #{
Msg = "This is a test message."
Proc = $PID
Cred = (Get-Credential 'Alex')
}
$Serialized = [System.Management.Automation.PSSerializer]::Serialize($Arguments)
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Serialized)
$EncodedArguments = [Convert]::ToBase64String($Bytes)
$ScriptBlock = "param([String]`$EncodedArguments = '$EncodedArguments')" + {
$Serialized = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedArguments))
$Arguments = [System.Management.Automation.PSSerializer]::Deserialize($Serialized)
Write-Host " $($Arguments.msg) FROM PID: $($Arguments.proc), cred: $( $Arguments.Cred.Username)"
}
$Bytes = [System.Text.Encoding]::Unicode.GetBytes( $ScriptBlock.ToString() )
$EncodedCommand = [Convert]::ToBase64String( $Bytes )
Start-Process -FilePath powershell -ArgumentList '-noprofile', '-noexit', '-EncodedCommand', $EncodedCommand
Related
We have working powershell script ran through start-process
$EncodedCommand = 'JABFAHIAcgBvAHIALgBjAGwAZQBhAHIAKAApAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABbAHMAdAByAGkAbgBnAF0AIAAkAEUAbgBjAG8AZABlAGQAQQByAGcAdQBtAGUAbgB0AHMAIAA9ACAAJwBQAEEAQgBQAEEARwBJAEEAYQBnAEIAegBBAEMAQQBBAFYAZwBCAGwAQQBIAEkAQQBjAHcAQgBwAEEARwA4AEEAYgBnAEEAOQBBAEMASQBBAE0AUQBBAHUAQQBEAEUAQQBMAGcAQQB3AEEAQwA0AEEATQBRAEEAaQBBAEMAQQBBAGUAQQBCAHQAQQBHAHcAQQBiAGcAQgB6AEEARAAwAEEASQBnAEIAbwBBAEgAUQBBAGQAQQBCAHcAQQBEAG8AQQBMAHcAQQB2AEEASABNAEEAWQB3AEIAbwBBAEcAVQBBAGIAUQBCAGgAQQBIAE0AQQBMAGcAQgB0AEEARwBrAEEAWQB3AEIAeQBBAEcAOABBAGMAdwBCAHYAQQBHAFkAQQBkAEEAQQB1AEEARwBNAEEAYgB3AEIAdABBAEMAOABBAGMAQQBCAHYAQQBIAGMAQQBaAFEAQgB5AEEASABNAEEAYQBBAEIAbABBAEcAdwBBAGIAQQBBAHYAQQBEAEkAQQBNAEEAQQB3AEEARABRAEEATAB3AEEAdwBBAEQAUQBBAEkAZwBBACsAQQBBADAAQQBDAGcAQQBnAEEAQwBBAEEAUABBAEIAUABBAEcASQBBAGEAZwBBAGcAQQBGAEkAQQBaAFEAQgBtAEEARQBrAEEAWgBBAEEAOQBBAEMASQBBAE0AQQBBAGkAQQBEADQAQQBEAFEAQQBLAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAFAAQQBCAFUAQQBFADQAQQBJAEEAQgBTAEEARwBVAEEAWgBnAEIASgBBAEcAUQBBAFAAUQBBAGkAQQBEAEEAQQBJAGcAQQArAEEAQQAwAEEAQwBnAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQA4AEEARgBRAEEAUABnAEIAVABBAEgAawBBAGMAdwBCADAAQQBHAFUAQQBiAFEAQQB1AEEARQA4AEEAWQBnAEIAcQBBAEcAVQBBAFkAdwBCADAAQQBGAHMAQQBYAFEAQQA4AEEAQwA4AEEAVgBBAEEAKwBBAEEAMABBAEMAZwBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAOABBAEYAUQBBAFAAZwBCAFQAQQBIAGsAQQBjAHcAQgAwAEEARwBVAEEAYgBRAEEAdQBBAEUARQBBAGMAZwBCAHkAQQBHAEUAQQBlAFEAQQA4AEEAQwA4AEEAVgBBAEEAKwBBAEEAMABBAEMAZwBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAOABBAEYAUQBBAFAAZwBCAFQAQQBIAGsAQQBjAHcAQgAwAEEARwBVAEEAYgBRAEEAdQBBAEUAOABBAFkAZwBCAHEAQQBHAFUAQQBZAHcAQgAwAEEARAB3AEEATAB3AEIAVQBBAEQANABBAEQAUQBBAEsAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEAUABBAEEAdgBBAEYAUQBBAFQAZwBBACsAQQBBADAAQQBDAGcAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEQAdwBBAFQAQQBCAFQAQQBGAFEAQQBQAGcAQQBOAEEAQQBvAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBQAEEAQgBUAEEARAA0AEEAZABBAEIAbABBAEgATQBBAGQAQQBBAHQAQQBIAFEAQQBaAFEAQgB6AEEASABRAEEATABRAEIAMABBAEcAVQBBAGMAdwBCADAAQQBEAHcAQQBMAHcAQgBUAEEARAA0AEEARABRAEEASwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEARAB3AEEAVAB3AEIAaQBBAEcAbwBBAEkAQQBCAFMAQQBHAFUAQQBaAGcAQgBKAEEARwBRAEEAUABRAEEAaQBBAEQARQBBAEkAZwBBACsAQQBBADAAQQBDAGcAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBQAEEAQgBFAEEARgBRAEEAUABnAEEAeQBBAEQAQQBBAE0AZwBBAHkAQQBDADAAQQBNAEEAQQAzAEEAQwAwAEEATQBBAEEAMwBBAEYAUQBBAE0AQQBBAHgAQQBEAG8AQQBNAEEAQQA0AEEARABvAEEATgBRAEEAMgBBAEMANABBAE4AUQBBADMAQQBEAFEAQQBPAFEAQQB5AEEARABrAEEATgBRAEEAcgBBAEQAQQBBAE0AdwBBADYAQQBEAEEAQQBNAEEAQQA4AEEAQwA4AEEAUgBBAEIAVQBBAEQANABBAEQAUQBBAEsAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBADgAQQBFADAAQQBVAHcAQQArAEEAQQAwAEEAQwBnAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEQAdwBBAFQAdwBCAGkAQQBHAG8AQQBJAEEAQgBPAEEARAAwAEEASQBnAEIARQBBAEcAawBBAGMAdwBCAHcAQQBHAHcAQQBZAFEAQgA1AEEARQBnAEEAYQBRAEIAdQBBAEgAUQBBAEkAZwBBAGcAQQBGAEkAQQBaAFEAQgBtAEEARQBrAEEAWgBBAEEAOQBBAEMASQBBAE0AZwBBAGkAQQBEADQAQQBEAFEAQQBLAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEQAdwBBAFYAQQBCAE8AQQBDAEEAQQBVAGcAQgBsAEEARwBZAEEAUwBRAEIAawBBAEQAMABBAEkAZwBBAHgAQQBDAEkAQQBQAGcAQQBOAEEAQQBvAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBEAHcAQQBWAEEAQQArAEEARQAwAEEAYQBRAEIAagBBAEgASQBBAGIAdwBCAHoAQQBHADgAQQBaAGcAQgAwAEEAQwA0AEEAVQBBAEIAdgBBAEgAYwBBAFoAUQBCAHkAQQBGAE0AQQBhAEEAQgBsAEEARwB3AEEAYgBBAEEAdQBBAEUATQBBAGIAdwBCAHQAQQBHADAAQQBZAFEAQgB1AEEARwBRAEEAYwB3AEEAdQBBAEUAUQBBAGEAUQBCAHoAQQBIAEEAQQBiAEEAQgBoAEEASABrAEEAUwBBAEIAcABBAEcANABBAGQAQQBCAFUAQQBIAGsAQQBjAEEAQgBsAEEARAB3AEEATAB3AEIAVQBBAEQANABBAEQAUQBBAEsAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAOABBAEYAUQBBAFAAZwBCAFQAQQBIAGsAQQBjAHcAQgAwAEEARwBVAEEAYgBRAEEAdQBBAEUAVQBBAGIAZwBCADEAQQBHADAAQQBQAEEAQQB2AEEARgBRAEEAUABnAEEATgBBAEEAbwBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEARAB3AEEAVgBBAEEAKwBBAEYATQBBAGUAUQBCAHoAQQBIAFEAQQBaAFEAQgB0AEEAQwA0AEEAVgBnAEIAaABBAEcAdwBBAGQAUQBCAGwAQQBGAFEAQQBlAFEAQgB3AEEARwBVAEEAUABBAEEAdgBBAEYAUQBBAFAAZwBBAE4AQQBBAG8AQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEQAdwBBAFYAQQBBACsAQQBGAE0AQQBlAFEAQgB6AEEASABRAEEAWgBRAEIAdABBAEMANABBAFQAdwBCAGkAQQBHAG8AQQBaAFEAQgBqAEEASABRAEEAUABBAEEAdgBBAEYAUQBBAFAAZwBBAE4AQQBBAG8AQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEAUABBAEEAdgBBAEYAUQBBAFQAZwBBACsAQQBBADAAQQBDAGcAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAOABBAEYAUQBBAGIAdwBCAFQAQQBIAFEAQQBjAGcAQgBwAEEARwA0AEEAWgB3AEEAKwBBAEUAUQBBAFkAUQBCADAAQQBHAFUAQQBWAEEAQgBwAEEARwAwAEEAWgBRAEEAOABBAEMAOABBAFYAQQBCAHYAQQBGAE0AQQBkAEEAQgB5AEEARwBrAEEAYgBnAEIAbgBBAEQANABBAEQAUQBBAEsAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQBnAEEARAB3AEEAUwBRAEEAegBBAEQASQBBAFAAZwBBAHkAQQBEAHcAQQBMAHcAQgBKAEEARABNAEEATQBnAEEAKwBBAEEAMABBAEMAZwBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBEAHcAQQBMAHcAQgBQAEEARwBJAEEAYQBnAEEAKwBBAEEAMABBAEMAZwBBAGcAQQBDAEEAQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAFAAQQBBAHYAQQBFADAAQQBVAHcAQQArAEEAQQAwAEEAQwBnAEEAZwBBAEMAQQBBAEkAQQBBAGcAQQBDAEEAQQBJAEEAQQA4AEEAQwA4AEEAVAB3AEIAaQBBAEcAbwBBAFAAZwBBAE4AQQBBAG8AQQBJAEEAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEMAQQBBAFAAQQBCAEMAQQBEADQAQQBkAEEAQgB5AEEASABVAEEAWgBRAEEAOABBAEMAOABBAFEAZwBBACsAQQBBADAAQQBDAGcAQQBnAEEAQwBBAEEASQBBAEEAZwBBAEQAdwBBAEwAdwBCAE0AQQBGAE0AQQBWAEEAQQArAEEAQQAwAEEAQwBnAEEAZwBBAEMAQQBBAFAAQQBBAHYAQQBFADgAQQBZAGcAQgBxAEEARAA0AEEARABRAEEASwBBAEQAdwBBAEwAdwBCAFAAQQBHAEkAQQBhAGcAQgB6AEEARAA0AEEAJwANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABBAHIAZwB1AG0AZQBuAHQAcwAgACAAPQAgAFsAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAFAAUwBTAGUAcgBpAGEAbABpAHoAZQByAF0AOgA6AEQAZQBzAGUAcgBpAGEAbABpAHoAZQAoACAAWwBTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBFAG4AYwBvAGQAaQBuAGcAXQA6ADoAVQBuAGkAYwBvAGQAZQAuAEcAZQB0AFMAdAByAGkAbgBnACgAWwBTAHkAcwB0AGUAbQAuAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACAAJABFAG4AYwBvAGQAZQBkAEEAcgBnAHUAbQBlAG4AdABzACAAKQApACAAKQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAUwBjAHIAaQBwAHQAQgBsAG8AYwBrACAAPQAgAHsADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIwBzAGIAMQAgAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAcABhAHIAYQBtACgAIAAkAFAAYQByAGEAbQAxACwAIAAkAFAAYQByAGEAbQAyACwAIAAkAFAAYQByAGEAbQAzACAAKQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIwByAGUAZwBpAG8AbgAgAE8AdQB0AGUAcgAgAHMAYwByAGkAcAB0ACAAYQBkAGQAaQB0AGkAbwBuAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABTAHQAYQByAHQALQBUAHIAYQBuAHMAYwByAGkAcAB0ACAALQBwAGEAdABoACAAIgBDADoAXABVAHMAZQByAHMAXABQAHUAYgBsAGkAYwBcAFQATQBQAFwAVAByAGEAbgBzAGMAcgBpAHAAdAAuAHQAeAB0ACIAIAAtAGYAbwByAGMAZQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQARwBsAG8AYgBhAGwAOgBQAFMAUwBjAHIAaQBwAHQATgBhAG0AZQAgAD0AIAAgACIAUwBjAHIAaQBwAHQAYgBsAG8AYwBrACIACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAUwBDAG8AbQBtAGEAbgBkAFAAYQB0AGgAIAA9ACAAIgBDADoAXABVAHMAZQByAHMAXABBAGwAZQB4AFwAQQBwAHAARABhAHQAYQBcAEwAbwBjAGEAbABcAFQAZQBtAHAAXABTAGMAcgBpAHAAdABiAGwAbwBjAGsAIgAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAjAGUAbgBkAHIAZQBnAGkAbwBuAA0ACgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAGcAZQB0AC0AZABhAHQAZQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAVQBzAGUAcgAgAD0AIAB3AGgAbwBhAG0AaQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAUgB1AG4AYQBzACAAPQAgAFQAZQBzAHQALQBFAGwAZQB2AGEAdABlAGQAUgBpAGcAaAB0AHMADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAB3AHIAaQB0AGUALQBoAG8AcwB0ACAAIgBVAHMAZQByACAAPQAgACQAVQBzAGUAcgAiAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAdwByAGkAdABlAC0AaABvAHMAdAAgACIAUgB1AG4AYQBzACAAPQAgACQAUgB1AG4AYQBzACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAB3AHIAaQB0AGUALQBoAG8AcwB0ACAAIgBQAGEAcgBhAG0AMQAgAD0AIAAkAFAAYQByAGEAbQAxACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAB3AHIAaQB0AGUALQBoAG8AcwB0ACAAIgBQAGEAcgBhAG0AMgAgAD0AIAAkAFAAYQByAGEAbQAyACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAB3AHIAaQB0AGUALQBoAG8AcwB0ACAAIgBQAGEAcgBhAG0AMwAgAD0AIAAkAFAAYQByAGEAbQAzACIADQAKAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIwByAGUAZwBpAG8AbgAgAE8AdQB0AGUAcgAgAHMAYwByAGkAcAB0ACAAYQBkAGQAaQB0AGkAbwBuACAAKAByAGUAdAB1AHIAbgAgAHIAZQBwAGwAYQBjAGUAKQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJABVAHMAZQByACAAfAAgAEUAeABwAG8AcgB0AC0AQwBsAGkAWABNAEwAIAAtAFAAYQB0AGgAIAAiAEMAOgBcAFUAcwBlAHIAcwBcAFAAdQBiAGwAaQBjAFwAVABNAFAAXABSAGUAcwB1AGwAdAAuAHgAbQBsACIAIAAtAEYAbwByAGMAZQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAdAByAHkAewAgAHMAdABvAHAALQB0AHIAYQBuAHMAYwByAGkAcAB0ACAAfQBjAGEAdABjAGgAewB9AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAjAGUAeABpAHQADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAjAGUAbgBkAHIAZQBnAGkAbwBuAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAB9AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAASQBuAHYAbwBrAGUALQBDAG8AbQBtAGEAbgBkACAALQBTAGMAcgBpAHAAdABCAGwAbwBjAGsAIAAkAFMAYwByAGkAcAB0AEIAbABvAGMAawAgAC0AQQByAGcAdQBtAGUAbgB0AEwAaQBzAHQAIAAgACQAQQByAGcAdQBtAGUAbgB0AHMA'
$Arguments = '-Noexit', '-NoLogo', '–NoProfile', '-ExecutionPolicy RemoteSigned', "-EncodedCommand $EncodedCommand"
# line below executed successfully
start-process -filepath powershell -ArgumentList $Arguments
Now we should transform our code to use System.Diagnostics.Process
$Process = New-Object System.Diagnostics.Process
$ProcessStartInfoParam = [ordered]#{
Arguments = ( "'" + ( $Arguments -join "', '" ) + "'" )
CreateNoWindow = $False
FileName = 'powershell'
WindowStyle = 'Normal'
LoadUserProfile = $False
UseShellExecute = $False
}
$ProcessStartInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' -Property $ProcessStartInfoParam
$Process.StartInfo = $ProcessStartInfo
$StartResult = $Process.Start()
We have no script output and $StartResult is true. Also trying to remove '-Noexit' argument.
I want to have new window with output like in first example.
You are joining the arguments incorrectly. Command-line arguments must be separated by space and quoted using double-quotation marks. In your case you don't need quoting as the arguments don't contain whitespace.
Try this:
$ProcessStartInfoParam = [ordered]#{
Arguments = $Arguments -join ' '
CreateNoWindow = $False
FileName = 'powershell'
WindowStyle = 'Normal'
LoadUserProfile = $False
UseShellExecute = $False
}
I have a Powershell script with parameters that I'd like to be able to self-elevate.
[CmdletBinding()]
param (
[Parameter(ParameterSetName="cp")]
[Switch]
$copy = $false,
[Parameter(ParameterSetName="mv")]
[Switch]
$move = $false
)
# Elevate if required
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
$Cmd = (
'-File',
"`"$($MyInvocation.MyCommand.Path)`"",
$MyInvocation.BoundParameters
)
$ProcArgs = #{
FilePath = 'PowerShell.exe'
Verb = 'RunAs'
ArgumentList = $Cmd
}
Start-Process #ProcArgs
Exit
}
}
Set-Location -LiteralPath $PSScriptRoot
Write-Host "$copy"
Pause
If I comment out the param block and run script.ps1 -copy, an elevated Powershell window opens and prints out Press enter to continue, i.e. it works.
If I comment out the if statement, the current window outputs True, i.e. it also works.
If I run the whole thing though, the elevated windows opens for a split second, then closes ignoring Pause with no output anywhere.
I want the elevated window to open and print out True.
I tested this on Linux and worked for me but couldn't test on Windows, I don't see other way around having to manipulate the $PSBoundParameters into strings to pass the arguments on -ArgumentList.
Below code is meant to be exclusively for testing, hence why I've removed the if conditions.
[CmdletBinding()]
param (
[Parameter(ParameterSetName="cp")]
[Switch]$copy,
[Parameter(ParameterSetName="mv")]
[Switch]$move
)
$argument = #(
"-File $PSCommandPath"
"-$($PSBoundParameters.Keys)"
)
$ProcArgs = #{
FilePath = 'powershell.exe'
Verb = 'RunAs'
ArgumentList = $argument
}
Start-Process #ProcArgs
"Started new Process with the argument: -$($PSBoundParameters.Keys)"
[System.Console]::ReadKey()
Exit
I've been trying for a couple of days now to multi-thread a WPF GUI which will run a PS3.0 script once the button has been clicked. I cannot use start-job as that I would have to track (multiple sessions at once), however, I would like to just run the script in a separate process of PS- as if I were to open multiple instances of the script from a shortcut. And be able to just have an open PS window which will track the progress within the script itself.
Expected results would be starting a script in powershell.exe session and passing 3 arguments - 2 strings and 1 boolean value. Which are provided by the user.
So in ISE:
C:\temp\test.ps1 -argumentlist $computername $username $citrixtest
Works fine.
I've spent a few hours scouring through the internet only to find a thread where a start-job was recommended or a way to use a background worker- this is not what I want from the script.
So I would guess the invocation from a button click would be something of the like (some of the things I have tried)
$ComputerName = "testtext1"
$UserName = "testtext2"
$CitrixTest = $True
$command = "c:\temp\test.ps1"
$arg = #{
Computername = "$computername";
Username = "$username";
CitrixTest = "$citrixtest"
}
#$WPFStartButton.Add_Click({
Start-Process powershell -ArgumentList "-noexit -command & {$command} -argumentlist $arg"
#})
Does not pass arguments to test.ps1- it is, however, getting to the "pause" - so the script successfully launches.
Where test.ps1 is
$ComputerName
$UserName
$CitrixTest
pause
Caller:
function Caller {
Param (
$ScriptPath = "c:\temp\test.ps1"
)
$Arguments = #()
$Arguments += "-computername $ComputerName"
$Arguments += "-UserName $UserName"
$Arguments += "-citrixtest $citrixtest"
$StartParams = #{
ArgumentList = "-File ""$ScriptPath""" + $Arguments
}
Start-Process powershell #StartParams
}
Caller
Does not start the script altogether- PS window just closes- possibly a path to .ps1 script not being found.
And a different approach which also nets in the script starts but not passing the arguments
$scriptFile = '"C:\temp\test.ps1"'
[string[]]$argumentList = "-file"
$argumentList += $scriptFile
$argumentlist += $computername
$argumentlist += $UserName
$argumentlist += $CitrixTest
$start_Process_info = New-Object System.Diagnostics.ProcessStartInfo
$start_Process_info.FileName = "$PSHOME\PowerShell.exe"
$start_Process_info.Arguments = $argumentList
$newProcess = New-Object System.Diagnostics.Process
$newProcess.StartInfo = $start_Process_info
$newProcess.Start() | Out-Null
Is there a way to make this work as I want it to? Or should I just dig deeper into runspaces and try with that?
#Bill_Stewart I just realized I did not put the param(args) in my script...
And that's why it would not pull those variables as I would like them to. I will have to check when I'm back in the office if it's just that what I was missing.
Checked on my laptop that's running PS 5.1 and this seems to be working as intended
$testarg = #(
'-File'
"C:\temp\test.ps1"
"$computername"
"$username"
"$citrixtest"
)
Start-Process powershell.exe -ArgumentList $testarg
Where test.ps1 is:
param(
$ComputerName,
$UserName,
$citrixtest
)
$ComputerName
$UserName
$CitrixTest
pause
I am trying to run the below command and it opens windows installers parameters, what am I doing wrong?
$current_pc = "$env:computername"
$filePath = "c:\users\ArA\Desktop\parameters.csv"
$machineParams = Import-CSV $filePath
$info = if($machineParams){$machineParams | where {$_.branch -eq $($current_pc.Substring($current_pc.length - 3,3))}}
else{write-output "CSV not loaded"}
$info
start-process msiexec.exe -Wait -ArgumentList /L* "c:\users\Ara\Desktop\t.log" /qn /I "c:\users\Ar\Desktop\setup.msi" DATABASE_ID=$($info.DATABASE_ID),ODBC_DATABASE_NAME=$($info.ODBC_DATABASE_NAME),ODBC_ENGINE_NAME=$($info.ODBC_ENGINE_NAME) ODBC_HOST_NAME=$($info.ODBC_HOST_NAME) NOLAN=1
It's likely how you are passing your arguments. As a best-practice, I utilize an array when passing exe arguments so they're interpreted properly:
$machineParams = Import-Csv -Path $Env:UserProfile\Desktop\parameters.csv
$info = if ($machineParams) {
$machineParams |
Where-Object { $_.branch -eq $Env:ComputerName.Substring($Env:ComputerName.Length - 3, 3) }
} else {
'CSV not loaded.'
}
$info
$StartArgs = #{
'Wait' = $true
'FilePath' = "$Env:SystemRoot\System32\msiexec.exe"
'ArgumentList' = #(
'/i',"$Env:UserProfile\Desktop\setup.msi"
'/qn'
'/log',"$Env:UserProfile\Desktop\t.log"
)
}
if ($info -ne 'CSV not loaded.') {
$StartArgs['ArgumentList'] += #(
"DATABASE_ID=$($info.DATABASE_ID)"
"ODBC_DATABASE_NAME=$($info.ODBC_DATABASE_NAME)"
"ODBC_ENGINE_NAME=$($info.ODBC_ENGINE_NAME)"
"ODBC_HOST_NAME=$($info.ODBC_HOST_NAME)"
'NOLAN=1'
)
}
Start-Process #StartArgs
How can I invoke a powershell script from within another script?
This is not working:
$param1 = "C:/Users/My Folder/file1"
$param2 = "C:/Users/My Folder/file2"
$command = "C:/Users/My Folder/second.ps1"
Invoke-expression $command -File1 $param1 -File2 $param2
...
Second.ps1:
param(
[string]File1, [string]File2)...
If there are no spaces:
Invoke-expression "$command $param1 $param2"
If you know where the spaces are:
Invoke-expression "$command `$param1HasSpaces` $param2"
NB: If your execution policy is restricted (check with get-executionpolicy use:
Invoke-Expression "powershell -executionpolicy bypass -command `"$command $param1 $param2`""
You can do it like this if you slightly change your approach. Basically create the command string you want to execute, then create a scriptblock object from that and then use Invoke-Command instead of Invoke-Expression.
$param1 = "C:/Users/My Folder/file1"
$param2 = "C:/Users/My Folder/file2"
$command = "C:/Users/My Folder/second.ps1"
$str = '{0} -File1 "{1}" -File2 "{2}"' -f ($command, $param1, $param2)
$sb = [scriptblock]::Create($str)
Invoke-Command -ScriptBlock $sb