Установка значения реестра для всех пользователей - PullRequest
2 голосов
/ 19 апреля 2011

Каков наилучший способ установить значение реестра для всех пользователей на машине.Перечисление HKEY_USERS и изменение ntuser.dat - это одно решение.

Любое другое решение, которое может использоваться в XP, VISTA, а также Windows 7?

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

Это невозможно сделать, если мы сохраняем только одну копию ключа в HKLM.Поскольку, если первый пользователь использует его и сбрасывает его, то другие пользователи не смогут его использовать.

Единственное решение, которое я могу придумать, - написать этот ключ всем пользователям, но это не работает в случае Windows 7.

Ответы [ 7 ]

6 голосов
/ 19 апреля 2011

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

Вы, вероятно, не хотите требовать прав администратора. В этом случае в реестре нет места, где пользователи без прав администратора могут хранить данные для совместного использования всеми пользователями. Следовательно, вы должны сохранить в файл в CSIDL_COMMON_APPDATA.

С другой стороны, возможно, что вы пытаетесь достичь, это установить значение во время установки, которое пользователи получат. Если они затем изменяют настройки в вашем приложении, вы хотите сохранить их в HKCU. Вы можете сделать это довольно легко, записав настройки по умолчанию в HKLM. Затем, когда ваше приложение считывает настройки, оно сначала выглядит в HKCU. Если настройка отсутствует, она считывает ее из HKLM. Приложение всегда записывает значения в HKCU. Другой вариант - встроить в программу настройки по умолчанию, а не HKLM, что упрощает установщик.

Суть в том, что итерация HKEY_USERS не является хорошим решением для любой проблемы, которую я могу себе представить.

0 голосов
/ 07 ноября 2017

Я нашел способ отправить файл .reg всем кустам пользователей в рег.Вам нужен доступ администратора и Powershell.

Я использую это в sccm, поэтому я хотел, чтобы он начинался с .bat, который использует .reg для импорта настроек current_user и сценария powershell.

Имя файла PowershellscriptWriteToHkcuFromSystem.ps1

PARAM (

[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) попробуйте {$ p = Start-Process -FilePath C: \ Windows \ regedit.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)) {Предупреждение о записи "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's registry"
        $explorers = Get-WmiObject -Namespace root\cimv2 -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's registry"
        $res = C:\Windows\system32\reg.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's registry (for future users)"
        C:\Windows\System32\reg.exe load 'HKU\DefaultUser' C:\Users\Default\NTUSER.DAT | Out-Null
        $RegFileContents = $registryData -replace 'HKEY_CURRENT_USER', 'HKEY_USERS\DefaultUser'
        Write-Registry -RegFileContents $RegFileContents
        C:\Windows\System32\reg.exe unload 'HKU\DefaultUser' | Out-Null
    }

} else {
    Write-Warning 'No mode was selected. Operation aborted'
} }

bat имя_файла addreg.bat

PowerShell.exe Set-ExecutionPolicy -ExecutionPolicy Неограниченно

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_USER \ Software \ blabla] значение = 1 и т. Д.

0 голосов
/ 20 апреля 2011

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

Я считаю, что наилучшее решение проблемы - использовать так называемую «Активную настройку», о которой вы можете прочитать здесь или здесь . Преимущество метода заключается в том, что он работает не только с локальными пользовательскими профилями , но также с перемещающимися пользовательскими профилями .

0 голосов
/ 19 апреля 2011

Может быть, вы можете попробовать использовать Active Setup.

0 голосов
/ 19 апреля 2011

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

Во время выполнения программное обеспечение всегда должно сначала пытаться считывать данные из HKCU и переходить к HKLM, если данные HKCU отсутствуют или устарели. Обычные пользователи всегда пишут в HKCU, гарантируя, что их собственные настройки отслеживают их собственные предпочтения.

Административные инструменты могут писать в HKLM, чтобы изменить настройки пользователя по умолчанию. Это немного трудоемко, но вы можете использовать явные записи меток времени, сохраняя время последнего изменения значения в кусте, и использовать его для обновления HKCU из HKLM всякий раз, когда HKLM имеет более свежую метку времени для обслуживания «системных администраторов», возможно, нуждающихся иметь возможность сброса определенных настроек на разные значения по умолчанию.

0 голосов
/ 19 апреля 2011

HKEY_LOCAL_MACHINE\Software\YourPath.Он может быть использован во время установки или с правами администратора.Вы хотите редактировать свой ключ каждым пользователем и каждый раз?

В этом случае: во время установки создать свой ключ в HKEY_LOCAL_MACHINE\Software\YourPath и указать SECURITY_ATTRIBUTES как MSDN библиотека показывает.

0 голосов
/ 19 апреля 2011

Это значение вашего реестра?В этом случае сохраните его в HKEY_LOCAL_MACHINE, чтобы у вас была только одна копия.

В противном случае перебор HKEY_USERS звучит хорошо и будет работать и в XP и Vista, если у вас есть соответствующие права для изменения реестрадругие пользователи.

РЕШЕНИЕ: Вы сохраняете ключ в HKLM в программе установки.Когда пользователь читает его, он записывает отдельный ключ в HKCU, отмечая, что он использовал общий ключ, поэтому он не будет читать его в следующий раз.Проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...