我们有一个 C++ 非托管应用程序,它似乎会导致 UAC 提示。似乎发生在Win7 而非 Vista
不幸的是,UAC dlg 是系统模式的,所以我无法附加调试器来检查代码所在的位置,并且在 msdev 下运行(我们使用的是 2008)以提升模式运行。
我们在程序/winmain 的开头放置了一个消息框,但它甚至没有达到那么远,所以显然这是在启动代码中。
是什么导致 UAC 通知这么早?我还可以采取哪些其他措施来查明原因?
EDIT
显然清单是这里的一个重要问题,但它似乎对我没有帮助 - 或者也许我没有正确配置清单文件。
有人可以提供样本清单吗?
另外,链接器/UAC 是否会发现程序“可能”写入注册表并据此设置其 UAC 要求?有些代码路径可能会触发 UAC,但当 UAC dlg 出现时,我们甚至还没有达到这一点。
另一个奇怪的是,在打开 UAC 的 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>
以下是使用ManifestViewer工具的实际EXE
- <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上无法正常工作)