首先让我骂一句, fuck UAC, fuck Vista!
今天算是对UAC有一点了解了, 麻烦的东西, 就因为这个, 很多xp下跑的好好的东西, vista全部说没权限. UAC有一个文档<<WindowsVistaUACDevReqs.doc>>, 老长的, 一个一个step, 废话一堆. 意思就是少写registry, 少写系统目录laf... 花了一上午大概看了一下, 主要是2步:
1. embed一个manifest 文件, 除了xp的visual style之外, 还要加一个trustinfo的section提升权限:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="Microsoft.Windows.SomeApp"
processorArchitecture="x86"
version="5.1.0.0"
type="win32"/>
<description>Windows Shell</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<!-- Identify the application security requirements. -->
<!-- level can be "asInvoker", "highestAvailable", or "requireAdministrator" -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
2. 这样的话, 就告诉vista要用管理员权限运行, 相当于linux下的root了. vista下奇怪的就是, 即使当前是administrator的帐号, 所有的程序还是运行在normal user权限下. 当level设置成asInvoker时, 权限根据调用者来定(CreateProcess, ShellExecute之类) . 设置成highestAvailable时, 则是当前帐号的最高可执行权限. requireAdministrator时, 则就是管理员权限. 如果开了UAC的话, 以administrator权限运行时, 就会prompt一个全局modal的对话框, 要求确认, laf... 确认就确认吧. M$自己的application都没有digital signature, 但是照样验证通过, 而我写的居然还说不信任-.-//, 于是还是加digital signature吧. MSDN上有说, 一堆看了很茫然的command line工具.
a) makecert
makecert.exe -sv mykey.pvk -n "CN=XXX Software Inc." mycert.cer
生成一个private key和certificate.
b) cert2spc
cert2spc.exe mycert.cer mycert.spc
转换成PKCS #7格式的certificate.
c) signtool
signtool signwizard
command line懒的看, 有一个GUI的wizard, 根据提示慢慢填吧. 然后就搞定了.
其实光这样还是不行的, MSDN上说makecert出来的certificate只是用来测试的, 因为issuer是Root Agency(摆明就是测试用的), 不在所谓的Trusted Root Certification Authorities store里面, 所以验证还是通不过的, 还是会告诉你不可信任, 不过点运行还是能有administrator权限的. 那怎么拿到一个trusted的certificate呢? 这个东西是要钱的. Purchase a certificate from a certificate authority, such as VeriSign, Inc. (MSDN)
好像这样就搞定了, 别急, 还有一个windows defender, 这个东西也很麻烦, 权限管理也很苛刻. 下次再说...



