1

Я хочу создать скрипт, который копирует файл во все профили пользователей, которые уже вошли в систему, и для нового пользователя, который вошел в Windows 10 шт. Расположение, в которое должны быть скопированы файлы: Users\username\AppData\Roaming

Пожалуйста, помогите не отлично в powershell

Вот мой текущий сценарий. Он будет копировать в существующие профили, но мне нужно добавить строку для копирования для новых пользователей, которые каждый раз входят в систему

$Source = '\\FileShare\FancyConfigurationFiles\Config.xml' 
$Destination = 'C:\users*\AppData\Roaming\' 
Get-ChildItem $Destination | ForEach-Object {Copy-Item -Path $Source -Destination $_ -Force}

2 ответа2

0

C:\Users\Default\ содержит файлы и настройки, используемые для создания папок профиля для любых учетных записей, которые входят в систему на компьютере, у которого еще нет папки профиля в C:\Users\

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

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

0

Я бы начал с вопроса реестра, где находятся профили, потому что они, теоретически, могут быть настроены. В связи с этим, так же как и расположение папки AppData\Roaming в каждом профиле, поэтому мы должны учитывать это, чтобы быть тщательным.

# Get the list of profile paths from the registry; since they theoretically can be customized.
$profileListReg = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'

# This filters out short SIDs (such as the system account)
$profilesReg = Get-ChildItem $profileListReg | Where-Object { $_.Name.Split('-').Count -gt 4 }

$userProfiles = @{}

# Add Default Profile to hashtable
foreach ($profileReg in $profilesReg) {
    $userProfiles.Add($profilesReg.PSChildName, (Get-ItemProperty ('Registry::{0}' -f $profileReg.Name)).ProfileImagePath)
}

# Add Default Profile to hashtable
#   This will cover new users getting the file
$userProfiles.Add('.DEFAULT', (Get-ItemProperty $profileListReg).Default)

$source = '\\FileShare\FancyConfigurationFiles\Config.xml'
$userShellFoldersReg = 'Registry::HKEY_USERS\{0}\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'

# Copy Config to each Profile ...
foreach ($userProfile in $userProfiles.GetEnumerator()) {
    Write-Verbose "$($userProfile.Name): $($userProfile.Value)"

    $userShellFolders = Get-Item ($userShellFoldersReg -f $userProfile.Name)
    $appData = $userShellFolders.GetValue('AppData','','DoNotExpandEnvironmentNames')
    Write-Verbose "AppData: ${appData}"

    $destination = $appData.Replace('%USERPROFILE%', $userProfile.Value)
    Write-Verbose "Destination: ${destination}"

    Copy-Item -Path $Source -Destination ($destination -f $userProfile) -Force
}

Вы должны закомментировать строку Copy-Item внизу и включить многословие ($VerbosePreference = 'continue'), чтобы проверить и убедиться, что эти подробные сообщения выглядят так, как вы ожидаете.

Примечание: мне не нравится использование HKLM: поскольку взаимодействие с реестром не возвращает полные пути с HKLM: оно возвращает HKEY_LOCAL_MACHINE . Таким образом, вы должны либо заменить их строкой, либо знать, что вы можете просто прикрепить Registry:: в начале и перейти к пути. В любом случае это более полезно, так как все ульи не доступны в качестве дисков PS.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .