Search code examples
windowspowershellwindows-server-2012windows-server-2012-r2powershell-4.0

Get-Credentials Password is "Null"


I've written a script that needs to connect to several remote servers that are not on a domain. The end goal is to use Invoke-Command to create a scheduled task on the remote servers.

$name = $server."Name";
$cred = Get-Credential "$name\admin";

It causes a prompt to open and I enter the admin password. But when I call:

Invoke-Command -ComputerName $addr -Script $Script1 -Credential $cred 

The terminal prompts for the UserId.

If the username is entered again this error is given:

Cannot validate argument on parameter 'Password'. The argument is null or empty.
Provide an argument that is not null or empty, and then try the command again.
    + CategoryInfo          : InvalidData: (:) [Register-ScheduledTask], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Register-ScheduledTask
    + PSComputerName        : 10.110.0.25

The script I'm running is this:

$Script1 = {Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force -Confirm:$False; $A=New-ScheduledTaskAction -Execute "powershell.exe" -argument "-file C:\PSWU\Shared\ps.ps1"; $p=New-ScheduledTaskPrincipal -RunLevel Highest ; $C=New-ScheduledTask -Action $A -Principal $p ; Register-ScheduledTask T1 -InputObject $C -Password $SecurePassword;}

Solution

  • It seems the problem here is , $Script here is a ScriptBlock and its in its own scope. So it doesn't have any value for $SecurePassword variable.

    use Param($SecurePassword) inside the script block and pass the original $SecurePassword vial -ArgumentList Parameter of Invoke-Command

    Here is an example.

    $Script = {param($r);"r is $r"}
    Invoke-Command -ScriptBlock $Script -ArgumentList 'Value for r'
    

    whatever the variables you are accessing inside a ScriptBlock either should be defined in side the ScriptBlock or should be passed as argument for Invoke-Command

    If you are using script block in a script which is locally running, you can use variable scoping.

    more info at Get-Help about_Script_Blocks

    here too : https://technet.microsoft.com/en-us/library/hh847893.aspx

    regards,

    Kvprasoon