Настройка значения реестра для всех пользователей

Вопрос:Каков наилучший способ установить значение реестра для всех пользователей на компьютере. Перечисление HKEY_USERS и изменение ntuser.dat - одно из решений. Любое другое решение, которое можно использовать в XP, VISTA, а также в Windows 7? На самом деле установщику необходимо записать один ключ в реестр. И этот ключ должен использоваться всеми пользователями. Как только его используемый

Вопрос:

Каков наилучший способ установить значение реестра для всех пользователей на компьютере.
Перечисление 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 и т.д.

Оцените статью
Добавить комментарий