Удалить автозапуск записей реестра для всех пользователей

Рассмотрим этот сценарий:

  • Inno Setup устанавливает программу с именем XYZ в Program Files, которая доступна для всех пользователей.
  • Параметр конфигурации в программе XYZ позволяет установить значение реестра для HKCU\Software\Microsoft\Windows\CurrentVersion\Run для каждого пользователя, чтобы пользователи могли настроить автоматический запуск приложения в соответствии со своими предпочтениями.
  • При удалении XYZ, если какой-либо пользователь, кроме текущего, имеет установленные ключи реестра для автоматического запуска, они будут оставлены и вызовут ошибки при следующем входе в систему.

Вопросы

  • Какой будет правильный способ удалить соответствующие значения реестра из всех учетных записей пользователей в Inno Setup?
  • Было бы целесообразно перечислить профили в HKU, проверить ключи и удалить их? Как это будет сделано в Inno Setup?
  • Наконец, какие проблемы могут возникнуть из-за перемещающихся профилей?

Рассматриваемая программа XYZ написана на C# и может перечислять через HKU следующий код, но я бы хотел полностью обработать удаление с помощью Inno Setup и не должен вызывать отдельный исполняемый файл при удалении.

private static string GetSIDFromUserName(string userName)
{
    var account = new System.Security.Principal.NTAccount(userName);
    var identifier = (System.Security.Principal.SecurityIdentifier)account.Translate(typeof(System.Security.Principal.SecurityIdentifier));
    var sid = identifier.Value;
    return sid;
}

private static string[] GetAllSystemUsers()
{
    List<string> names = new List<string>();
    SelectQuery query = new SelectQuery("Win32_UserAccount");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    foreach (ManagementObject envVar in searcher.Get())
    {
        names.Add((string)envVar["Name"]);
    }
    return names.ToArray();
}

1 ответ

Решение

Чтобы удалить запись автозапуска от всех пользователей, используйте:

procedure DeleteAutoRunEntryFromAllUsers(AutoRunValueName: string);
var
  Names: TArrayOfString;
  UserKey: string;
  AutoRunKey: string;
  I: Integer;
begin
  Log('Enumerating user keys');
  RegGetSubkeyNames(HKEY_USERS, '', Names);
  Log(Format('Found %d user keys', [GetArrayLength(Names)]));

  for I := 0 to GetArrayLength(Names)-1 do
  begin
    UserKey := Names[I];
    Log(Format('User %s', [UserKey]));
    AutoRunKey := Format('%s\SOFTWARE\Microsoft\Windows\CurrentVersion\Run', [UserKey]);

    if RegValueExists(HKEY_USERS, AutoRunKey, AutoRunValueName) then
    begin
      Log(Format('Deleting auto-run entry from user %s', [UserKey]));

      if RegDeleteValue(HKEY_USERS, AutoRunKey, AutoRunValueName) then
      begin
        Log(Format('Deleted auto-run entry from user %s', [UserKey]));
      end
        else
      begin
        Log(Format('Failed to delete auto-run entry from user %s', [UserKey]));
      end;
    end;
  end;
end;

Не уверен насчет перемещаемых профилей.


Рассматривали ли вы добавление записи автозапуска в HKEY_LOCAL_MACHINE, но сделайте приложение для немедленного выхода в зависимости от настройки в HKEY_CURRENT_USER (по предпочтению пользователя)?

Таким образом, вы можете просто удалить один HKEY_LOCAL_MACHINE значение. Настройка в HKEY_CURRENT_USER может быть оставлен позади.

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