通过系统配置文件将文件复制到文件夹中

Copying file into folder via system profile

我正在尝试替换 Firefox 配置文件中的 prefs.js 文件,以更改 firefox 在大约 5k 台机器上的行为方式。

我杀了firefox,用脚本删除了文件

Remove-Item -Path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*\prefs.js" -Force -Recurse

这没有问题。然后我使用 copy-item 将所需的 prefs.js 副本拉入机器上的所有 firefox 配置文件。这是我要问的脚本。

$Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*"
Copy-Item "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force -Recurse

当我在自己的(域管理员)帐户上手动 运行 脚本时,我收到所有不是我的用户配置文件的访问被拒绝错误,但文件已成功复制到我的 firefox 配置文件。这似乎很正常,因为它只是 运行 普通权限。这是该执行的日志摘录:

Get-ChildItem : Access is denied
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:2 char:11
+ $Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Fir ...
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (C:\Users\<removed>\AppData:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Access is denied
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:2 char:11
+ $Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Fir ...
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (C:\Users\<removed>\AppData:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

但是,当我用我们的部署解决方案(如 SCCM 等)发送脚本时,我收到以下错误:

PS>TerminatingError(Copy-Item): "Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified method is not supported."
Copy-Item : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified 
method is not supported.
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:3 char:61
+ ... tem "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force  ...
+                                                           ~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.CopyItemCommand
 Copy-Item : Cannot convert 'System.Object[]' to the type 'System.String'
required by parameter 'Destination'. Specified method is not supported.
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:3 char:61
+ ... tem "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force  ...
+                                                           ~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.CopyItemCommand

当我第一次注意到这一点时,我认为脚本需要类似 'foreach' 的东西来处理 $Target 将提取的每个条目(运行 为所有 firefox 配置文件设置脚本),而不是-递归。

如果是这样,那么当我手动 运行 它时它也不应该工作,但是当我这样做时它会遍历每个配置文件,让我无法访问我可以访问的位置'在没有提升权限的情况下进行编辑,适用于我的个人资料,并在没有转换错误的情况下完成。

任何人都可以帮助我理解为什么我的 Copy-Item 无法通过系统配置文件 运行 解析目标 $Target 吗?

您正在使用 $Targets

创建对象数组
$Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*"

这样您就不会通过管道传输输出,而只是将数组放入新命令中。 试试这个

Get-ChildItem "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*" -Directory | foreach-object{Copy-Item "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $_ -Force -Recurse}