Справка с пониманием, почему диалоговое окно контроля учётных записей открывается на Win7 для нашего приложения

У нас есть C++ неуправляемое приложение, которое, кажется, вызывает подсказку контроля учётных записей. Это, кажется, происходит на Win7 а НЕ на Vista

К сожалению, контроль учётных записей dlg является системой, модальной, таким образом, я не могу присоединить отладчик для регистрации в коде, где это, и работающий под msdev (мы используем 2008), выполнения в поднятом режиме.

Мы помещаем окно сообщения в начале нашего program/winmain, но это даже не получает это далеко, таким образом, по-видимому, это находится в коде запуска.

Что может вызвать уведомление контроля учётных записей настолько рано и что другие вещи я могу сделать для разыскивания причины?

Править

По-видимому, декларация является важной проблемой здесь, но это, кажется, не помогает мне - или возможно я не настраиваю файл манифеста правильно.

Кто-то может предоставить демонстрационную декларацию?

Кроме того, волшебство компоновщика/КОНТРОЛЯ УЧЁТНЫХ ЗАПИСЕЙ выясняет, что программа "могла" бы записать в реестр и установить свои требования контроля учётных записей на основе этого? Существуют пути выполнения кода, которые могли бы инициировать контроль учётных записей, но мы даже не в той точке, когда контроль учётных записей dlg подходит.

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

Вот декларация (что я думаю, сгенерирован автоматически):

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

И затем этот был добавлен к явному списку, чтобы видеть, поможет ли он

<?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="[removed for anonymity]" 
    type="win32" 
/> 
<description>
    [removed for anonymity]
</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="x86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        />
    </dependentAssembly>
</dependency>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>        
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Следующее от фактического EXE с помощью инструмента ManifestViewer

- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="x86" name="[removed]" type="win32" /> 
  <description>[removed]</description> 
- <dependency>
- <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" /> 
  </dependentAssembly>
  </dependency>
- <dependency>
- <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> 
  </dependentAssembly>
  </dependency>
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
- <security>
- <requestedPrivileges>
  <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
  </requestedPrivileges>
  </security>
  </trustInfo>
  </assembly>

Кажется, что это могло бы произойти из-за xp установки совместимости на нашем приложении. Я должен буду протестировать это. (мы устанавливаем это в установщике, который я узнал, потому что некоторые аудиодрайверы не работают правильно над win7),

6
задан 14 revs, 3 users 100% 9 May 2010 в 19:14
поделиться

5 ответов

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

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

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

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

11
ответ дан 8 December 2019 в 12:20
поделиться

Если вы даже не добираетесь до своей основной функции, значит, либо DLL, используемая вашим приложением, что-то делает при инициализации DllMain, либо ваше приложение есть манифест с запросом повышения.

Думаю, у вас должна быть возможность удаленно отлаживать его с помощью windbg; когда отображается приглашение, вы можете войти в отладчик и посмотреть, что пытается сделать ваше приложение.

5
ответ дан 8 December 2019 в 12:20
поделиться

Первое, что я проверю, - это манифест приложения. Это одно из первых, на что Windows обращает внимание при создании процесса. Он определенно взаимодействует с UAC.

2
ответ дан 8 December 2019 в 12:20
поделиться

Другим интересным решением для PHP 5,2 и выше является использование расширения фильтра: http://www.php.net/manual/en/book.filter.php

Это позволяет проверять и очищать пользовательские вводы. Имеется множество встроенных фильтров, которые можно комбинировать с флагами для изменения их поведения. Кроме того, эти фильтры могут также использоваться для проверки/очистки входов, поплавков, сообщений электронной почты и определенных регулярных выражений.

Я лично начал использовать их в своих проектах для проверки форм и вывода введенных пользователем данных, и я очень рад, что это сделал. Хотя, когда я вставляю значения в базу данных MySQL, я использую подготовленные запросы для дополнительной безопасности. Эти решения вместе помогут избежать большинства инъекций SQL и атак типа XSS.

-121--3853777-

Честно говоря, имеет _ и _ принадлежит _ многим - это очень устаревший способ делать вещи. Вы, вероятно, должны посмотреть на _ много: через , который является новым способом объединения таблиц, и уже довольно давно.

class Foo < ActiveRecord::Base
  has_many :foobars
  has_many :bars, :through => :foobars

  def add_many_bars(bars)
    bars.each do |bar|
      self.bars << bar
    end
  end
end

class Bar < ActiveRecord::Base
  has_many :foobars
  has_many :foos, :through => :foobars
end

class FooBar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end

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

-121--1861445-

В Windows 7 (но не Vista), если вы говорите, что приложение нуждается в параметрах настройки совместимости XP, оно также повысит. Смотрите UAC на Win7 отличается от Vista? - Если вам не нужно поднимать, но вы должны быть помечены XP compat, я не думаю, что вы можете что-то сделать. OTOH, если вам не нужно быть компатом XP, прекратите просить, чтобы быть.

1
ответ дан 8 December 2019 в 12:20
поделиться

Dependency Walker (depends.exe) wqs изначально написан для устранения проблем с DLL, но его режим профилирования более полезен, чем этот. Его можно использовать для сбора большого количества информации о создании процесса. Было бы интересно увидеть, в частности, какие библиотеки DLL необходимы и какие из них были загружены в момент запроса UAC. Также вполне возможно, что вывод Depenceny Walker явно упоминает UAC.

0
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: