从XML提取用户信息传入Register-ScheduledTask时遇SID映射错误
问题:Register-ScheduledTask传入XML提取的User参数报错
问题描述
在PowerShell环境下使用Register-ScheduledTask cmdlet时,尝试从任务XML文件中提取TaskName、TaskPath和User参数值传入cmdlet(而非手动指定)。已成功提取拆分出$TaskName和$TaskPath,也获取到Principal节点的UserId,但将其赋值给$User传入时,出现错误无法完成账户名与安全ID的映射。
奇怪的是,带空格的$TaskName能正常传入,直接将$User设为带引号的字符串(如"S-1-5-18")时cmdlet可正常运行。
相关代码片段:
[xml]$taskXml = Get-Content -Path $XmlPath $taskUser = $($task.xml.Task.Principals.Principal.UserId) [string]$User = $(taskUser | Out-String) Register-ScheduledTask -Xml (Get-Content -Path $XmlPath -Raw) -User $User
问题原因及解决方法
核心问题
- 变量名拼写错误:代码中
$task.xml是笔误,实际定义的XML变量是$taskXml;同时taskUser | Out-String里的taskUser缺少$符号,导致无法正确引用变量。 - 多余的格式转换:使用
Out-String会给提取到的UserId字符串添加额外的换行符或空白字符,Register-ScheduledTask无法识别带冗余空白的用户ID/安全标识符,进而抛出映射错误。实际上从XML节点提取的UserId本身就是字符串类型,无需额外转换。
修正后的代码
[xml]$taskXml = Get-Content -Path $XmlPath # 修正变量引用,直接提取UserId,无需Out-String转换 $User = $taskXml.Task.Principals.Principal.UserId # 可选:若担心XML中存在首尾空白,可添加Trim()清理 # $User = $taskXml.Task.Principals.Principal.UserId.Trim() Register-ScheduledTask -Xml (Get-Content -Path $XmlPath -Raw) -User $User
额外提示
如果XML文件中包含多个Principal节点,需要确保提取的是目标任务对应的节点(比如通过索引[0]指定第一个,或匹配节点的Id属性),避免获取空值或错误的用户ID。
内容的提问来源于stack exchange,提问作者AirAzure
相关产品推荐
相关产品推荐

