带有 Clixml 和 Taskscheduler 的 PowerShell 脚本

PowerShell Script with Clixml and Taskscheduler

这是问题所在:

当我手动 运行 我的 PowerShell 脚本时,一切正常。但它不能通过任务调度工作。

原因可能是我存储的 Active Directory 和移动设备凭据 Management.I 将它们存储在 "Export-Clixml" 中,但是当我使用任务计划程序打开脚本时无法读取 xml 文件.没有它就完美了。

任务计划程序由之前在 XML 中保存凭据的同一用户执行。

希望你明白我的意思。


编辑 1:

我试过 "Bender the Greatest" 的解决方案。 不幸的是它仍然不起作用。我使用 "Export-Clixml" 导出我的凭据并使用 "Import-Clixml" 导入它们。

无论我是通过我的管理员帐户还是通过系统帐户(使用 psexec)手动生成它们都没有关系。如果我然后通过生成凭据的相应帐户执行它,它仍然不起作用。

但它似乎找到了凭据(我在日志中看到了)。但是导入似乎不起作用。

如果我在脚本中手动包含凭据,它可以正常工作,但我希望将它们加密存储。

[Lizenzauswertung] Überprüfe Zugangsdaten
[Lizenzauswertung] MDM Zugangsdaten gefunden - Credentials found
[Lizenzauswertung] MDM AccessToken gefunden - Credentials found
[Lizenzauswertung] AD Zugangsdaten gefunden - Credentials found

我正在尝试从 XML 文件解密密码:

It is not possible to call a method for an expression that has NULL.(Translated)
In C:\Scripts\ADAuswertung\AD_Auswertung_GKZ.ps1:171 Zeichen:1
+ $PSCPW  = $CredsMDM.GetNetworkCredential().Password
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
It is not possible to call a method for an expression that has NULL.(Translated)
In C:\Scripts\ADAuswertung\AD_Auswertung_GKZ.ps1:171 Zeichen:1
+ $PSCPW  = $CredsMDM.GetNetworkCredential().Password
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

这是用户名的替代品,用于网络请求的正确拼写:

It is not possible to call a method for an expression that has NULL.(Translated)
In C:\Scripts\ADAuswertung\AD_Auswertung_GKZ.ps1:172 Zeichen:1
+ $RPSCUser = $PSCUser.Replace("INTRA","intra.lan")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

It is not possible to call a method for an expression that has NULL.(Translated)
In C:\Scripts\ADAuswertung\AD_Auswertung_GKZ.ps1:172 Zeichen:1
+ $RPSCUser = $PSCUser.Replace("INTRA","intra.lan")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

在这里您可以看到导入 MDM 凭据时发生的错误。错误的原因如上所述。我在导入凭据后编辑凭据,然后再将它们传递给脚本。

MDM 访问令牌未加密,可以读取。

AD 凭据未预先处理,而是直接传递给 AD 命令。因此,此处不会显示任何错误。因为它没有完成我在日志中看到的 AD 报告,所以这些也没有导入。

这里是 Import/Export 的一小段代码片段。刚刚在此处获得了 MDM 凭据的代码。其他查询同理

If (Test-Path $CredentialsMDM){
        $CredsMDM = Import-Clixml -Path $CredentialsMDM
        Write-Host "[Lizenzauswertung] MDM Zugangsdaten gefunden" -ForegroundColor Green
    } else {
        Write-Host "[Lizenzauswertung] MDM Zugangsdaten nicht gefunden" -ForegroundColor Yellow
        Get-Credential -Message "Zugangsdaten für MDM / Airwatch" | export-clixml -path $CredentialsMDM
        $CredsMDM = Import-Clixml -Path $CredentialsMDM
}

Write-Host "[Lizenzauswertung] Zugangsdaten überprüft" -ForegroundColor Green

$PSCUser = $CredsMDM.UserName
$PSCPW  = $CredsMDM.GetNetworkCredential().Password
$RPSCUser = $PSCUser.Replace("INTRA","intra.lan")

$AccessToken = $CredsMDMAT.accesstoken
$Auth = $CredsAD

(对不起,意大利面条代码。)

你需要提供你得到的错误,但我要在黑暗中拍摄。我猜您要么以一个用户的身份导出 secretAD.xml 并以另一个用户的身份从 Task Scheduler 中 运行 运行您的脚本,要么在另一个 computer/server 上导出 secretAD.xml。默认情况下,凭据只能由在该特定服务器上构建凭据的用户解密This is how Windows' Data Protection API (DPAPI) works.

解决此问题的简单方法是生成 secretAD.xml 作为您打算 运行 脚本的用户。您 可以 指定您自己的解密密钥,任何用户都可以在任何盒子上使用它,但是您需要找到一种将解密密钥安全传送到 运行时间。如果您 want/need 到 运行 脚本为 NT Authority\SYSTEM,我建议使用 psexec 打开交互式 SYSTEM Powershell 会话,生成凭据,然后使用 Export-CliXml 将凭证序列化为 secretAD.xml.


请注意,当帐户密码轮换时,默认的 DPAPI 密钥会发生变化,因此您需要记住在发生这种情况时重建凭据。

我找到了解决问题的方法。

原因是凭证的路径是“.\secretMDM.xml”。 任务调度程序在不同的位置执行脚本。 因此我必须指定文件的整个路径。

谢谢你的帮助。

编辑: 出于兴趣,我使用任务计划程序创建了“凭据”- XML 文件。查看它存储文件的位置 ;)