带有 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 文件。查看它存储文件的位置 ;)
这是问题所在:
当我手动 运行 我的 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 文件。查看它存储文件的位置 ;)