这段时间把自己之前开发的系统移植到了Vista系统下,开始的时候程序还运行得好好的,调用在线升级以后,发展程序不正常了。打开程序所在的目录,发现在线升级程序图标右下角有了一个盾牌的标志(在线升级程序的名字为:GisUpdate.exe),说明在线升级程序没能通过Vista的UAC认证。Vista系统我自己也用的不多,主要是我用的开发工具在它下面都装不起来,并且之前听说Vista对Win32的程序支持的不是太好,比如迅雷会影响IE7下载文件的问题。出现不能通过UAC认证的问题,开始我以为我的在线升级程序是不是使用了非通用的API函数或是开发工具中版本专有的功能,逐渐的把代码注释后编译再放到Vista系统下,没能通过认证,最后是注释了所有的代码,一样的也没有能通过认证。我想着是不是第一次没能通过认证,Vista就记录下来该程序,后面也不能通过认证,为了验证这个问题,我把在线升级程序的文件名改了,通过了Vista的UAC认证。接着我又起来逐步取消之前的注释,文件名也进行了修改,到最后全部的注释都取消,也就是回到了在线升级的完整功能,都通过的UAC的认证。这样的话就可以确定程序本身是没有问题的,把程序改成原来的GisUpdate.exe,晕,又没能通过认证,再把名字改回来,又通过了认证,这样就可以判断是跟名字本身有关系。出现这个问题是不是因为我的升级程序中包含的Update字样与Vista本身的升级程序有冲突,它的程序本身有管理员权限,而我的程序本身没有管理权限,所有没能通过UAC认证(估计的,望知道的兄弟补充和纠正)。
把程序改名发布后,突然想起来,想看看Vista下的其它应用程序的升级程序有没有这样的问题,进行全盘搜索后发现QQ的目录下的两个文件:QQLiveUpdate.exe和QQUpdateCenter.exe,这两个文件都通过了Vista的UAC认证,那就说明是有办法让带有Update字样的文件通过UAC认证。用OllyDbg载入这两个程序分析,什么也没有找到,这也就说明起到通过UAC认证的功能不在代码中,可能在其它的地方。打开Visual C++ 6.0,选择“File”里面的“Open”,然后在“Open as”中选择“Resources”,打开QQ下面的那两个带Update字样的程序,发现资源文件里面都有类型为“24”,ID为“1”的资源。在程序里在进行分析,发现都没有什么地方用到这个资源,我就干脆把这个资源删除,保存后,发现QQ的这两个程序也没能通过UAC的认证,这说明是这段资源起到了让程序通过UAC认证的功能。我把这段代码拷贝了出来,原来是一段XML代码: