Powershell 脚本 - 如果 PW 不正确,则重新提示密码屏幕

Powershell Script - Re-Prompt Password Screen If PW is İncorrect

我有一个脚本可以使用以下脚本更改所有本地管理员密码。脚本将提示每个服务器的密码。 (所有服务器都有不同的密码) 如果用户输入错误的密码,我想重新提示凭据屏幕,但我无法处理。

$servers = Get-Content "C:\Users\Administrator\Desktop\Scripts\TestServers.txt"

foreach($server in $servers)
{
    $pingtest = Test-Connection -ComputerName $server -Quiet -Count 1 -ErrorAction SilentlyContinue

    if($pingtest)
    {
        Write-Host($server + " is online")
        try
        {
            $ServerSessions = New-PSSession -ComputerName $server -Credential 'Administrator' 
            
        }catch [System.UnauthorizedAccessException]
        {
            Write-Host("Credential is incorrect! Try again")
            $ServerSessions = New-PSSession -ComputerName $server -Credential 'Administrator'
           
        }

            Invoke-Command -Session $ServerSessions -ScriptBlock {
                # Windows Server Versiyonunu check edip parolayı ona göre set etmek için
                Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
                $Password = Read-Host -AsSecureString
                $UserAccount = Get-LocalUser -Name "Administrator"
                $UserAccount | Set-LocalUser -Password $Password
            }

        else
        {
            Write-Host($server + " is offline, nothing to do")
        }
                    
    }
} 

我在 运行 脚本时遇到此错误:

<IP_Address> is online
New-PSSession : [<IP_Address>] Connecting to remote server <IP_Address> failed with the following error message : Access is denied. For more information, see the 
about_Remote_Troubleshooting Help topic.
At line:12 char:31
+ ... rSessions = New-PSSession -ComputerName $server -Credential 'Administ ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionOpenFailed
Invoke-Command : Cannot validate argument on parameter 'Session'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
At line:22 char:37
+             Invoke-Command -Session $ServerSessions -ScriptBlock {
+                                     ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Invoke-Command], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand
 
else : The term 'else' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path 
is correct and try again.
At line:30 char:9
+         else
+         ~~~~
    + CategoryInfo          : ObjectNotFound: (else:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

            Write-Host($server + " is offline, nothing to do")

如果我使用正确的密码,脚本可以正常运行。

更新

解决方案

以下方法有效,但我无法使用 catch [System.UnauthorizedAccessException] 处理 catch 语句。相反,我使用了 catch [Exception]。这不是一个好的解决方案,但现在对我来说效果很好。

$servers = Get-Content "C:\Users\Administrator\Desktop\Scripts\TestServers.txt"
    
    foreach($server in $servers)
    {
        $pingtest = Test-Connection -ComputerName $server -Quiet -Count 1 -ErrorAction SilentlyContinue
    
        if($pingtest)
        {
            Write-Host($server + " is online")
            $Creds = Get-Credential 'Administrator'
            do{
                try
                {
                    $ServerSessions = New-PSSession -ComputerName $server -Credential $Creds -ErrorAction Stop
                    Write-Host ("$ServerSessions")
                    
            
                }catch [Exception]
                {
                    Write-Host("Credential is incorrect! Try again")
                    $Creds = Get-Credential 'Administrator'
                }
            }while(!$ServerSessions)
    
            Invoke-Command -Session $ServerSessions -ScriptBlock {
                # Windows Server Versiyonunu check edip parolayı ona göre set etmek için
                Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
                $Password = Read-Host -AsSecureString
                $UserAccount = Get-LocalUser -Name "Administrator"
                $UserAccount | Set-LocalUser -Password $Password
            }
        }
        else {
            Write-Host($server + " is offline, nothing to do")
        }
    } 

if 语句的大括号不正确。这就是正确缩进代码的重要性。

要重试身份验证,请使用 while 循环,该循环将一直循环直到建立新会话。例如:

$servers = Get-Content "C:\Users\Administrator\Desktop\Scripts\TestServers.txt"

foreach($server in $servers)
{
    $pingtest = Test-Connection -ComputerName $server -Quiet -Count 1 -ErrorAction SilentlyContinue

    if($pingtest)
    {
        Write-Host "$server is online"
        while ($True) {
            try
            {
                $Cred = Get-Credential -UserName 'Administrator'
                $ServerSession = New-PSSession -ComputerName $server -Credential $Cred
                break
        
            }catch [System.UnauthorizedAccessException]
            {
                Write-Host "Credential is incorrect! Try again"
            }
        }
        
        try {
            Invoke-Command -Session $ServerSession -ScriptBlock {
                # Windows Server Versiyonunu check edip parolayı ona göre set etmek için
                Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
                $Password = Read-Host -AsSecureString
                $UserAccount = Get-LocalUser -Name "Administrator"
                $UserAccount | Set-LocalUser -Password $Password
        }
        finally {
            Remove-PSSession $ServerSession
        }

    }
    else {
        Write-Host "$server is offline, nothing to do"
    }
} 

Try/catch 如果不是停止错误则不起作用,因此将 -ErrorAction Stop 参数添加到您的会话中,然后将 try/catch 包装在 [=16= 中] 循环基于你是否有一个会话,并在 Catch 部分获得新的信用。

    $Creds = Get-Credentials 'Administrator'
    Do{
    try
    {
        $ServerSessions = New-PSSession -ComputerName $server -Credential $Creds -ErrorAction Stop
        
    }catch [System.UnauthorizedAccessException]
    {
        Write-Host("Credential is incorrect! Try again")
        $Creds = Get-Credentials 'Administrator'
       
    }
    }While(!$ServerSessions)