При удалении записи реестра windows с помощью nsis нужно ли нам удалять каждую запись из реестра windows?

Мое требование: когда я запускаю установщик NSIS, сначала он должен проверить, есть ли у пользователя права администратора, и если у пользователя есть привилегии, то при установке приложение должно записать путь и значения в реестр Windows.

Чтобы проверить административные привилегии, я написал приведенный ниже фрагмент кода в

.onInit

RequestExecutionLevel admin

Function .onInit
UserInfo::GetAccountType
pop $0
${If} $0 != "admin"
MessageBox mb_iconstop "Administrator rights required!"
SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
Quit
${Else}
MessageBox MB_OK "User is having Administrative Permissions"
${EndIf}

FunctionEnd

Если у пользователя есть разрешения, я написал приведенный ниже код для установки записей реестра Windows.

;--------------------------------
; The stuff to install
Section "RegistryTest (required)"

  SectionIn RO

  ; Set output path to the installation directory. Here is the path C:\Program Files\RegistryTest
  SetOutPath $INSTDIR

  ; Write the installation path into the registry

  ;Adding Registry entries under "Dialog"
   WriteRegDWORD HKLM SOFTWARE\RegistryTest\Dialog "AppDataDlg" "1"
   WriteRegStr HKLM SOFTWARE\RegistryTest\Dialog "ReplaceTestWebPage" "http://www.Test.com/tools/upgrade_selector/index.cfm?Localize=true"
   WriteRegStr HKLM SOFTWARE\RegistryTest\Dialog "UpgradeUpsUrl" "http://www.Test.com/tools/upgrade_selector/Testindex.cfm?Localize=true"

  ;Adding Registry entries under "EventLogging"
   WriteRegStr HKLM SOFTWARE\RegistryTest\EventLogging "ImagePath" "$INSTDIR\eventlog.dat"

   ;Adding Registry entries under "Notifications"
    WriteRegDWORD HKLM SOFTWARE\RegistryTest\Notification "Notification Sounds Enabled" "1"

    ;Adding Registry entries under "POS"
    WriteRegDWORD HKLM SOFTWARE\RegistryTest\POS "Enabled" "0"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "HttpClient" "TestData.exe"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "HttpPacketVer" "1"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "HttpServer" "updates.test.com"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "HttpServerUrl" "/Test/pos/tetstatus.cfm"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "ProductCode" "0"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "ProductVer" "00"
    WriteRegStr HKLM SOFTWARE\RegistryTest\POS "ZipCode" ""
    
    
  ; Write the uninstall keys for Windows
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RegistryTest" "DisplayName" "RegistryTest"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RegistryTest" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RegistryTest" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RegistryTest" "NoRepair" 1
  WriteUninstaller "uninstall.exe"

SectionEnd

Ниже приведены пояснения, которые у меня есть:

  1. Работает ли условие административных разрешений, которое я написал, для всех операционных систем или есть какие-то определенные операционные системы?

  2. Является ли код, который я написал, сначала я проверяю разрешения, а затем записываю его в реестр. Это правильный путь? Пожалуйста, сообщите, требуются ли какие-либо изменения.

  3. Здесь я нашел одно наблюдение:

Мой пользователь является администратором, и если мы используем реестр Windows «HKLM», то при обычном запуске установщика «NSIS» или от имени администратора он обрабатывает его как пользователя с правами администратора и переходит в другое состояние и отображает сообщение как «Пользователь имеет права администратора». "

Если я использую реестр Windows «HKCU», то при запуске установщика «NSIS» он обычно переходит в состояние «Если» и показывает «Требуются права администратора!». И если я запускаю «NSIS» от имени администратора, он обрабатывает его как пользователя с правами администратора и переходит в другое состояние и отображает сообщение «Пользователь имеет административные права».

Здесь, почему это происходит по-разному для "HKLM" и "HKCU"? Это потому, что «HKLM» будет иметь права администратора, а «HKCU» не будет иметь разрешений.

  1. В разделе «Удалить» я не удаляю каждый раздел реестра Windows, а напрямую использую uninstall.exe. Но при удалении он удаляет все записи из реестра Windows. Итак, здесь не требуется удалять каждую запись реестра?
0
0
431
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1) Работает на всех системах.

2) Прерывание в .onInit в порядке

3) Не следует писать в HKCU, если вы работаете как администратор. UAC может привести к тому, что установщик запустится от имени «неправильного» пользователя, и вы в конечном итоге напишете администраторам HKCU вместо обычного пользователя.

4) DeleteRegKey удалит все значения в ключе (и подразделах), вам не нужно вручную удалять каждый элемент.

Привет @Anders, Спасибо за разъяснения. Итак, вы имеете в виду, что мы должны использовать HKLM вместо HKCU. И также я понял из моей вышеупомянутой программы, что если мы используем HKLM с пользователем с правами администратора, это показывает, что у пользователя есть права администратора. И если мы используем обычного пользователя с HKLM, он запрашивает права администратора (это условие я проверю). Я правильно понимаю?

Yar 01.11.2018 07:30
UserInfo::GetAccountType всегда работает одинаково, он не имеет ничего общего с HKLM и HKCU. Если вы не являетесь администратором и не проверяете, являетесь ли вы администратором, тогда он потерпит неудачу, если вы попытаетесь написать в HKLM.
Anders 01.11.2018 15:05

Другие вопросы по теме