8

Возможный дубликат:
Запретить повышение прав (UAC) для приложения, которому оно не нужно

Я использую приложение, которое было написано до Windows Vista/Windows 7. Windows решила, что приложение должно запускаться от имени администратора (т. Е. Оно имеет значок щита). Я уверен, что приложение не имеет ничего в своем манифесте, что указывает на то, что оно должно работать с повышенными привилегиями (оно было написано намного раньше Windows Vista).

Есть ли способ сказать Windows, что конкретное приложение не нуждается в повышенных привилегиях?

3 ответа3

14

Windows автоматически повышает уровень приложений на основе различных критериев (перечисленных в разделе Общие сведения об управлении учетными записями пользователей в Windows Vista):

Перед созданием 32-битного процесса проверяются следующие атрибуты, чтобы определить, является ли он установщиком:

  • Имя файла включает в себя такие ключевые слова, как "установить", "настройка", "обновить" и т.д.
  • Ключевые слова в следующих полях ресурсов управления версиями: поставщик, название компании, название продукта, описание файла, исходное имя файла, внутреннее имя и имя экспорта.
  • Ключевые слова в параллельном манифесте, встроенном в исполняемый файл.
  • Ключевые слова в определенных записях StringTable, связанных в исполняемом файле.
  • Ключевые атрибуты в данных RC связаны в исполняемом файле.
  • Целевые последовательности байтов в исполняемом файле.

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

9

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

Примечание . Если программа не работает в Windows XP, она будет продолжать работать в Windows Vista или Windows 7. Вы можете проверить это приложение, войдя в Windows XP и посмотрев, работает ли оно. ( Это можно сделать , чтобы войти в систему Windows XP в качестве обычного пользователя, не так ли?)

Если программа не сможет правильно работать в Windows XP как обычный пользователь, она не сможет работать в Windows 7 как обычный пользователь. Если вы должны запустить программу от имени администратора в Windows XP, вы должны запустить программу от имени администратора в Windows 7.

Если вы удовлетворены тем, что программу не нужно запускать от имени администратора, вы можете добавить инструкцию Manifest для Windows о том, что ее следует запускать как обычный пользователь, которым вы являетесь.

Создайте файл манифеста в той же папке, что и ваше приложение. Например, Goldwave.exe вы создаете:

Goldwave.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="IsUserAdmin"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Примечание. Это так называемый внешний манифест, поскольку он находится в отдельном файле. Вполне возможно, что приложение уже имеет манифест.

Манифесты были введены в Windows 2000 как способ объявления зависимостей от определенных версий DLL. Одно из распространенных применений этого манифеста пришло вместе с Windows XP, чтобы программы объявляли свою зависимость от 6-й версии comctl32.dll - чтобы приложение было "тематическим".

Если в приложении уже есть встроенный манифест, Windows проигнорирует любой внешний манифест. В этом случае вам нужно будет использовать Resource Hacker для изменения встроенного RT_MANIFEST (тип ресурса 24).


Следующее, что вы можете сделать, это проверить реестр, чтобы убедиться, что кто-то уже применил в вашей программе повышенный шим. Загрузите Regedit и проверьте:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags
    \Layers

Там вы, вероятно, найдете большое количество программ с разделенными пробелами:

  • C:\Program Files (x86)\ACDSee32\ACDSee32.exe HIGHDPIAWARE
  • C:\Program Files (x86)\Google\Picasa3\Picasa3.exe ELEVATECREATEPROCESS
  • C:\Program Files (x86)\skiStunt\skiStunt\bin\skiStunt.exe WINXPSP2
  • C:\Program Files (x86)\Steam\Steam.exe HIGHDPIAWARE ELEVATECREATEPROCESS
  • C:\Program Files (x86)\SysInternals\autoruns.exe ELEVATECREATEPROCESS RUNASADMIN
  • C:\Program Files (x86)\Windows Live\Messenger\msnmsgr.exe VISTASP2
  • D:\Games\Call of Duty\CoDSP.exe WINXPSP3
  • D:\Shared\Win32app\Spy\SPYXX.EXE DISABLEDWM

Убедитесь, что вашей программы там нет. Вы также можете найти аналогичный набор записей (для « всех пользователей ») в:

HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers
1

Если приложение было написано задолго до Windows Vista /7, то вполне вероятно, что для его запуска могут потребоваться права администратора. Многие программы предполагали, что лицо, устанавливающее программу, будет иметь права администратора, поэтому они просто записывали в разделы реестра и файловую систему, которые программист считал лучше всего.

Я знаю это из своего личного опыта. Около десяти лет назад я работал в компании, которая продала свое программное обеспечение крупной автомобильной компании. Все их компьютеры были заблокированы. Мы должны были изменить наш код, чтобы он мог быть установлен кем-то, работающим только с правами "пользователя".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .