Вопрос:
Каков наилучший способ установить значение реестра для всех пользователей на компьютере.
Перечисление HKEY_USERS и изменение ntuser.dat – одно из решений.
Любое другое решение, которое можно использовать в XP, VISTA, а также в Windows 7?
На самом деле установщику необходимо записать один ключ в реестр. И этот ключ должен использоваться всеми пользователями. Как только его используемый ключ должен быть reset.
Это невозможно сделать, если мы сохраняем только одну копию ключа в HKLM. Поскольку, если первый пользователь использует его и reset, а затем другие пользователи не смогут его использовать.
Единственное решение, о котором я могу думать, это написать этот ключ всем пользователям, но он не работает в случае Windows 7.
Лучший ответ:
Шаблон, используемый всем программным обеспечением, который нуждается в этом объекте, HKLM – это хранилище по умолчанию для чтения, установленное во время установки.
Во время выполнения программное обеспечение всегда должно сначала считывать данные из HKCU и возвращаться к HKLM, если данные HKCU отсутствуют или устарели. Регулярные пользователи всегда записывают в HKCU, гарантируя, что их собственные настройки отслеживают собственные настройки.
Административные средства могут записывать в HKLM, чтобы изменить настройки пользователей по умолчанию. Это немного работает, но вы можете использовать явные записи временной метки, сохраняя последний раз, когда значение в улье было изменено, и используйте это для обновления HKCU из HKLM, когда HKLM имеет более свежую метку времени для обслуживания “системных администраторов”, возможно, уметь reset определенные настройки для разных значений по умолчанию.
Ответ №1
Вы не можете писать частям реестра, принадлежащим другому пользователю, если у вас нет прав администратора. Если вы можете получить права администратора, вы бы гораздо лучше использовали HKLM. Даже если вы можете перебирать HKEY_USERS, это в лучшем случае хрупкое решение.
Вероятно, вы не хотите требовать прав администратора. В этом случае в реестре нет места, где пользователи, не являющиеся администраторами, могут хранить данные для совместного использования между всеми пользователями. Следовательно, вы должны сохранить файл в CSIDL_COMMON_APPDATA.
С другой стороны, возможно, то, что вы пытаетесь достичь, – установить значение во время установки, которое пользователи заберут. Если они затем изменят настройку в вашем приложении, вы хотите сохранить ее в HKCU. Вы можете сделать это довольно легко, записав настройки по умолчанию на HKLM. Затем, когда ваше приложение читает настройки, оно сначала выглядит в HKCU. Если настройка отсутствует, она считывает ее из HKLM. Приложение всегда записывает значения в HKCU. Другим вариантом является создание настроек по умолчанию в программе, а не HKLM, что упрощает установку.
Суть в том, что итерация HKEY_USERS не является хорошим решением любой проблемы, которую я могу предусмотреть.
Ответ №2
Это значение вашего реестра? В этом случае сохраните его в HKEY_LOCAL_MACHINE, чтобы у вас была только одна копия.
В противном случае итерация по HKEY_USERS звучит неплохо и будет работать и с XP и Vista, если у вас есть правильные права на изменение реестра для других пользователей.
РЕШЕНИЕ: Вы сохраняете ключ в HKLM в установщике. Когда пользователь читает его, он записывает отдельный ключ в HKCU, отмечая, что он использовал общий ключ, поэтому он не будет читать его в следующий раз. Проблема решена.
Ответ №3
HKEY_LOCAL_MACHINESoftwareYourPath. Его можно использовать во время установки или прав администратора. Вы хотите редактировать свой ключ каждым пользователем и каждый раз?
В этом случае: при установке создать свой ключ в HKEY_LOCAL_MACHINESoftwareYourPath и указать SECURITY_ATTRIBUTES, поскольку отображается MSDN.
Ответ №4
Возможно, вы можете попробовать использовать Active Setup.
Ответ №5
Если вы устанавливаете какое-либо приложение, которое ждет значения реестра в части реестра HKCU, вы не можете выбрать другое место в реестре. Поэтому для настройки установленного приложения необходимо установить часть HKCU всех пользователей, которые будут работать на компьютере. Это стандартная проблема при развертывании программного обеспечения.
Я нахожу лучшее решение проблемы для использования так называемой “Active Setup”, о которой вы можете прочитать здесь или здесь. Преимущество метода заключается в том, что он работает не только с локальными профилями пользователей, но также с перемещение профилей пользователей.
Ответ №6
Я нашел способ подталкивания файла .reg ко всем пользовательским ульям в reg. Вам нужен доступ администратора и Powershell.
Я использую это в sccm, поэтому я хотел, чтобы он начинался с .bat, он использует .reg для импорта настроек current_user и powershell script.
Имя файла Powershellscript WriteToHkcuFromSystem.ps1
ПАРАМЕТР (
[Parameter(Mandatory=$true)] [ValidatePattern(‘.reg$’)] [string]$RegFile, [switch]$CurrentUser, [switch]$AllUsers, [switch]$DefaultProfile )
Функция Write-Registry { PARAM ($ RegFileContents) $ tempFile = ‘{0} {1: yyyyMMddHHmmssff}.reg’ -f [IO.Path]:: GetTempPath(), (Get-Date) $ RegFileContents | Out-File -FilePath $tempFile Write-Host ( “Запись реестра из файла {0}” -f $tempFile) try {$ p = Start-Process -FilePath C:Windowsregedit.exe -ArgumentList “/s $tempFile” -PassThru -Wait} catch {} if ($ p -ne $null) {$ exitCode = $p.ExitCode} else {$ exitCode = 0} if ($ exitCode -ne 0) { Write-Warning ‘Ошибка слияния файла reg’ } else { Remove-Item -Path $tempFile -Force -ErrorAction SilentlyContinue }}
if (-not (Test-Path -Path $RegFile)) { Write-Warning “RegFile $RegFile не существует. Операция отменена” } else {
if($CurrentUser -or $AllUsers -or $DefaultProfile) { Write-Host (‘Reading the registry file {0}’ -f $RegFile) $registryData = Get-Content -Path $RegFile -ReadCount 0 if($CurrentUser) { Write-Host «Writing to the currenlty loggoed on user registry» $explorers = Get-WmiObject -Namespace rootcimv2 -Class Win32_Process -Filter «Name=’explorer.exe'» $explorers | ForEach-Object { $owner = $_.GetOwner() if($owner.ReturnValue -eq 0) { $user = ‘{0}{1}’ -f $owner.Domain, $owner.User $ntAccount = New-Object -TypeName System.Security.Principal.NTAccount($user) $sid = $ntAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value $RegFileContents = $registryData -replace ‘HKEY_CURRENT_USER’, «HKEY_USERS$sid» Write-Registry -RegFileContents $RegFileContents } } } if($AllUsers) { Write-Host «Writing to every user registry» $res = C:Windowssystem32reg.exe query HKEY_USERS $res -notmatch ‘S-1-5-18|S-1-5-19|S-1-5-20|DEFAULT|Classes’ | ForEach-Object { if($_ -ne ») { $sid = $_ -replace ‘HKEY_USERS\’ $RegFileContents = $registryData -replace ‘HKEY_CURRENT_USER’, «HKEY_USERS$sid» Write-Registry -RegFileContents $RegFileContents } } } if($DefaultProfile) { Write-Host «Writing to the default profile registry (for future users)» C:WindowsSystem32reg.exe load ‘HKUDefaultUser’ C:UsersDefaultNTUSER.DAT | Out-Null $RegFileContents = $registryData -replace ‘HKEY_CURRENT_USER’, ‘HKEY_USERSDefaultUser’ Write-Registry -RegFileContents $RegFileContents C:WindowsSystem32reg.exe unload ‘HKUDefaultUser’ | Out-Null } } else { Write-Warning ‘No mode was selected. Operation aborted’ } }
bat filename addreg.bat
PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Unrestricted
PowerShell.exe -File “% ~ dp0WriteToHkcuFromsystem.ps1” -RegFile “% ~ dp0Example.reg” -CurrentUser -AllUsers -DefaultProfile
PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Restricted
и .reg файл Example.reg
Редактор реестра Windows версии 5.00
[HKEY_CURRENT_USERSoftwareblabla] value = 1 и т.д.