【问题标题】:Remote powershell sessions can only be established with interactively entered credentials?只能使用交互式输入的凭据建立远程 powershell 会话?
【发布时间】:2019-08-05 17:56:01
【问题描述】:

我正在尝试自动化一个从 O365 收集数据的 powershell 脚本。我有一个特殊的受限用户设置,具有 O365 所需的权限,并且在服务器上允许本地登录,这样我就可以“运行”该用户(我对下面的所有脚本都这样做。我已经验证了不同的,以其他用户身份运行时的预期错误)。

当这样设置凭据并打开会话时,脚本可以交互地正常工作:

$cred  = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $cred -Authentication Basic –AllowRedirection         

但是,如果我创建用于自动化的凭据文件:

Get-Credential | Export-Clixml -Path C:\batch\${env:USERNAME}_cred.xml

然后通过脚本访问:

$cred = Import-Clixml -Path C:\batch\${env:USERNAME}_cred.xml
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $cred -Authentication Basic –AllowRedirection 

凭据文件加载似乎成功。然后我在会话打开时得到“拒绝访问”,然后由于会话为空,脚本的其余部分当然会失败。在所有情况下,我都在剪切和粘贴密码(加上尝试过很多次,包括手动输入),所以我认为这不是一个简单的拼写错误问题。似乎更像是我对powershell的根本误解。最终,我不仅希望凭据自动化,而且如果我还需要任何特殊设置,还可以从任务调度程序运行它。

【问题讨论】:

  • 如果您在交互式会话中导入文件并检查保存的密码(使用 pscredential 对象上的 GetNetworkCredential 方法),密码是否相同?我不确定您是否真的可以使用 export-clixml 导出安全字符串。
  • 您在尝试导入/导出文件时是否使用不同的主机或用户?密码由 DPAPI 加密,对于 用户和主机 组合是唯一的。
  • @bluuf 如果我写托管 $cred.Username 它出来是正确的。 $cred.GetNetworkCredential().Password 上的 Write-Host 虽然不返回密码。我实际上是从同一目录中完全不同的 powershell 脚本中获取一段代码!
  • @TheIncorrigible1 同一个主机,同一个用户。
  • 如果是这种情况,您的问题中缺少一些内容,因为我无法重现您的问题。

标签: powershell session powershell-remoting


【解决方案1】:

从 PowerShell 的角度来看,您的代码没有任何问题。我已经测试了您在公司域中创建凭据的方式,并且我能够通过导入凭据XML 文件来创建新会话,该文件是通过按照您的方式导出凭据而创建的。然后我假设它可能与MS Exchange 相关。

我可以建议您尝试的替代方案:

# First we need to get the encrypted password:
$TempCred = Get-Credential
# provide credentials to the prompt

# now the encryption to be saved in a file
$TempCred.Password | ConvertFrom-SecureString | Set-Content C:\mypass.txt

这是您密码的加密版本,保存为文本。

在您的自动化脚本中,您现在可以这样做:

 $username = "yourusername"
 $password = Get-Content C:\mypass.txt | ConvertTo-SecureString
 $cred = New-Object System.Management.Automation.PsCredential($username, $password)
 $session = New-PSSession -Credential $cred .....

我不确定这是否适用于您的情况,它适用于我的公司域。 XML 版本也对我有用。如果您不想了解XML 方式不起作用的原因,我只是提供替代方法来尝试。

【讨论】:

  • 我们确实让它工作了,但我不记得如何了。我一直想尝试重现解决方案序列并在此处发布,但还没有时间。
  • 我很高兴它成功了,但我也很想知道你的解决方案。
  • @BrianKnoblauch ~ 你还记得你是怎么做到的吗?
  • @InteXX 好吧,我的一个用户几周前刚刚提到他在几个月内没有看到任何关于此的报告......我去检查了,果然是不再工作。快速重置凭据以防万一,但没有任何变化。不幸的是,由于我的其他中断/修复和项目负载,我还没有时间再次认真工作。
  • @BrianKnoblauch ~ 现在这不是巧合!希望你能够让它工作。
【解决方案2】:

至少在我的环境中,我可以通过调用Import-PSSession

$Credential = Import-Clixml -Path D:\Modules\O365Credentials.xml
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $Credential -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking
Get-Mailbox

【讨论】:

    【解决方案3】:

    相关帐户是否启用了 MFA?如果是这样,你可以试试this

    这个脚本:

    • 下载 Exchange Online 远程 PowerShell 模块
    • 安装 Exchange Online PowerShell 模块
    • 使用 MFA 连接 Exchange Online PowerShell

    或者,您可以手动执行这些操作。更多信息,包括详细的演练,请点击此处:

    https://o365reports.com/2019/04/17/connect-exchange-online-using-mfa/

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2010-10-29
      • 2022-12-06
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多