如何在超时时实现Get-Credential

时间:2016-02-05 16:09:15

标签: powershell user-input

在我的一些脚本中,我有一种通过Get-Credential cmdlet获取PSCredential对象的后备方法。这在以交互方式运行这些脚本时非常有用,尤其是在测试期间等。

如果&当我通过任务调度程序运行这些脚本时,我想确保它们不会卡在等待交互式输入,如果它们没有必要的凭据就会失败。请注意,如果将任务设置为在正确的应用程序帐户下运行,则不应发生这种情况。

有没有人知道一种方法可以让我提示输入带有超时(并且可能是一个NULL凭证对象),这样脚本就不会卡住了?

很高兴考虑使用Read-Host代替Get-Credential的更一般情况。

1 个答案:

答案 0 :(得分:1)

我在一些脚本中使用类似的东西,基于读取主机上的超时,代码在这里:

Function Read-HostTimeout {
#  Description:  Mimics the built-in "read-host" cmdlet but adds an expiration timer for
#  receiving the input.  Does not support -assecurestring

# Set parameters.  Keeping the prompt mandatory
# just like the original
param(
    [Parameter(Mandatory=$true,Position=1)]
    [string]$prompt,

    [Parameter(Mandatory=$false,Position=2)]
    [int]$delayInSeconds=5,

    [Parameter(Mandatory=$false,Position=3)]
    [string]$defaultValue = 'n'
)

# Do the math to convert the delay given into milliseconds
# and divide by the sleep value so that the correct delay
# timer value can be set
$sleep = 250
$delay = ($delayInSeconds*1000)/$sleep
$count = 0
$charArray = New-Object System.Collections.ArrayList
Write-host -nonewline "$($prompt):  "

# While loop waits for the first key to be pressed for input and
# then exits.  If the timer expires it returns null
While ( (!$host.ui.rawui.KeyAvailable) -and ($count -lt $delay) ){
    start-sleep -m $sleep
    $count++
    If ($count -eq $delay) { "`n"; return $defaultValue}
}

# Retrieve the key pressed, add it to the char array that is storing
# all keys pressed and then write it to the same line as the prompt
$key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp").Character
$charArray.Add($key) | out-null

# Comment this out if you want "no echo" of what the user types
Write-host -nonewline $key

# This block is where the script keeps reading for a key.  Every time
# a key is pressed, it checks if it's a carriage return.  If so, it exits the
# loop and returns the string.  If not it stores the key pressed and
# then checks if it's a backspace and does the necessary cursor 
# moving and blanking out of the backspaced character, then resumes 
# writing. 
$key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp")
While ($key.virtualKeyCode -ne 13) {
    If ($key.virtualKeycode -eq 8) {
        $charArray.Add($key.Character) | out-null
        Write-host -nonewline $key.Character
        $cursor = $host.ui.rawui.get_cursorPosition()
        write-host -nonewline " "
        $host.ui.rawui.set_cursorPosition($cursor)
        $key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp")
    }
    Else {
        $charArray.Add($key.Character) | out-null
        Write-host -nonewline $key.Character
        $key = $host.ui.rawui.readkey("NoEcho,IncludeKeyUp")
    }
}
Write-Host ""
$finalString = -join $charArray
return $finalString
}
相关问题