我有一个Powershell脚本,用于远程调用其他服务器上的其他Powershell脚本。该脚本用于关闭和启动不同服务器上的服务。 Powershell脚本的设置方式是我所要做的就是通过调用serverStartStop [START|STOP]
来调用它,它会自动且有条不紊地进入服务器列表并关闭每个服务器上的服务列表。
我最近升级到系统,需要在启动一些服务后运行批处理脚本。我可以远程调用批处理脚本,但批处理脚本调用另一个尝试访问网络共享的命令。该命令失败,因为用于调用该命令的任何用户都没有足够的权限来访问该共享。
我已经尝试了几种方法来解决这种情况,并对Powershell中的Invoke-Command
命令行开关和Windows Batch的runas
命令进行了一些研究。 runas
命令要求为用户提供密码,这是不可接受的,因为这是一个自动脚本。除了进行初始START或STOP呼叫之外,有没有人知道如何干净利落地完成这项工作并且没有用户互动?
答案 0 :(得分:1)
Invoke-Command上的-Credential方法可能就是你想要的。我发现这对于以加密方式存储用于编写脚本的凭证集非常有用。
Add-Type -assembly System.Security
# String to Crypt
$passwordASCII = Read-Host -Prompt "Enter the Password"
# String to INT Array
$enc = [system.text.encoding]::Unicode
$clearPWD_ByteArray = $enc.GetBytes( $passwordASCII.tochararray())
# Crypting
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine
$bakCryptedPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Protect($clearPWD_ByteArray, $null, $secLevel)
# Store in Base 64 form
$B64PWD_ByteArray = [Convert]::ToBase64String($bakCryptedPWD_ByteArray)
Set-Content -LiteralPath c:\Temp\pass.txt -Value $B64PWD_ByteArray
<#>
Use...
Add-Type -assembly System.Security
$resCryptedPWD_ByteArray = [Convert]::FromBase64String((Get-Content -LiteralPath "$Password_File"))
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine
$clearPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Unprotect( $resCryptedPWD_ByteArray, $null, $secLevel )
$enc = [system.text.encoding]::Unicode
...To retrieve the password from $Password_File
Then use...
$enc.GetString($clearPWD_ByteArray)
...As your password
</#>
答案 1 :(得分:1)
听起来像double hop problem。众所周知,这些都很难解决,因为您传递的凭据无法通过第二个系统进行身份验证。
CredSSP is a solution,但确实会增加安全风险,因此请务必小心,确保您了解配置,并确保正确配置。