Копирование файла в папку через системный профиль - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь заменить файл prefs.js в профиле Firefox, чтобы изменить поведение 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), а не -recurse.

Если бы это было так, то это также не должно работать вообще, когда я запускаю его вручную, но когда я делаю это, он просматривает каждый профиль, дает мне доступ, запрещенный для мест, которые я не могу редактировать без повышенных разрешений, работает для моегопрофиль и завершается без ошибки преобразования.

Может кто-нибудь помочь мне понять, почему мой Copy-Item не может разрешить целевой объект $ Target при запуске системным профилем?

1 Ответ

0 голосов
/ 25 июня 2018

Вы создаете массив объектов, используя $ 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}
...