У нас есть 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),
Windows автоматически повышает уровень приложений на основе различных критериев (перечисленных в Общие сведения и настройка управления учетными записями пользователей в Windows Vista ):
До создается 32-битный процесс, проверяются следующие атрибуты , чтобы определить, является ли он установщиком :
- Имя файла включает такие ключевые слова, как "install", "setup", «обновление» и т. д.
- Ключевые слова в следующих полях ресурса управления версиями: поставщик, название компании, название продукта, описание файла, исходное имя файла, внутреннее имя и имя экспорта.
- Ключевые слова в параллельном манифесте встроены в исполняемый файл.
- Ключевые слова в определенных записях StringTable, связанных в исполняемом файле.
- Ключевые атрибуты в данных RC связаны в исполняемом файле.
- Целевые последовательности байтов в исполняемом файле.
Лучшее решение для всего этого - создать манифест, предотвращающий повышение , хотя переименования файла может быть достаточно.
Если вы даже не добираетесь до своей основной функции, значит, либо DLL, используемая вашим приложением, что-то делает при инициализации DllMain, либо ваше приложение есть манифест с запросом повышения.
Думаю, у вас должна быть возможность удаленно отлаживать его с помощью windbg; когда отображается приглашение, вы можете войти в отладчик и посмотреть, что пытается сделать ваше приложение.
Первое, что я проверю, - это манифест приложения. Это одно из первых, на что Windows обращает внимание при создании процесса. Он определенно взаимодействует с UAC.
Другим интересным решением для 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, прекратите просить, чтобы быть.
Dependency Walker (depends.exe) wqs изначально написан для устранения проблем с DLL, но его режим профилирования более полезен, чем этот. Его можно использовать для сбора большого количества информации о создании процесса. Было бы интересно увидеть, в частности, какие библиотеки DLL необходимы и какие из них были загружены в момент запроса UAC. Также вполне возможно, что вывод Depenceny Walker явно упоминает UAC.