设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 3048|回复: 15
打印 上一主题 下一主题

[其它] EXE修改安全级别并启动ACCESS项目

[复制链接]
跳转到指定楼层
1#
发表于 2008-9-27 22:59:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、什么是office安全级别限制
       我们用EXCEL或ACCESS为平台,开发项目并分发给客户使用时,会遇到因默认安全级别限制,而使项目不能顺畅运行的情况,这主要是因为office为了防止VBA编写的宏病毒或恶意代码的侵害,而提供的一种安全预防措施。
      以2003版ACCESS为例,其宏安全级别分为:高、中、低三个级别(见图1):
   高:只允许运行可靠来源签署的宏,未经签署的宏会自动取消。所谓签署的宏就是自定义的数字签名(关于如何建立自己的数字签名大家可以参看有关资料)。只有通过这个数字签名的认证才能通过此安全级别,否则项目将无法运行。
   中:您可以选择是否运行可能不安全的宏。这一级别会在项目运行时弹出警示对话框,让你确认所运行的项目的宏是否安全,点确定则允许运行,取消则取消运行。
   低:这三个安全级别中最低的级别,这一级别对于所有运行VBA项目不进行强制认证、拦截或给出警告提示,但这一设置有可能放任宏病毒的侵害。
  
                                          (图1)

二、避开安全级别限制方法潜析
       安全级别限制虽然为我们预防宏病毒提供了一定保障,但这位忠实的监护者过于热心,带给我们的不一定都是愉悦,因为它同时也限制了正常项目的运行。有什么办法能让我们避开安全级别的限制,确保我们开发项目的顺畅运行呢?
       取消安全级别限制的方法论坛中见到不少,大家仁者见仁、智者见智,但总体来说无外乎三种:
      1、 通过安全级别对话框,手动将安全级别设定为最低及可
      2、 建立自己VBA项目数字证书,然后在VBA编辑器中设置引用该证书,就建立了属于你自己的宏签名。
      3、 修改ACCESS安全级别在注册表中有关键值,将对应键值设定为:1。修改注册表的方法有很多种,可以通过手动,或是编程,还有在项目打包发布工具修改键值。
  1. 注册表中对应键值:
  2. HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Access\Security\Level
  3. 键值: = 1 为:低 = 2 为:中 = 3 为:高
复制代码
虽然,以上三种方法都能避开安全级别的限制,但从利于项目分发角度来说,本人倾向于第三种通过编程修改注册表的方法。
以上啰嗦这么多,各位也许会说本文有点文不对题,大有挂羊头买狗肉这嫌,哈哈。各位不用心急,以上所述主要是让大家对于安全级别有个初步的印象,同时也是为说明本人为何倾向于选择第三种方法(代码修改注册表键值)的原委。
      闲话少说,下面我们就进入本文的正题,即:如何通过程序或代码方法修改安全级别注册表键值。

三、如何用VB避开安全级别限制并启动ACCESS项目
       在进入正题之前,再说几句题外话。即:为什么不用ACCESS自身的VBA来编程修改注册表安全级别对应键值而选VB来实现操作。
       大家也许听过“能医不自医”俗语,ACCESS就如此 “能医”,虽VBA编程能实现修改注册表解除安全级别限制,但却因自身受安全级别限制影响,而无法运行VBA,又何以来修改安全级别。而VB工程不受VBA安全限制,就无此之忧,而且编译后的EXE直接启动ACCESS项目,让你的ACCESS项目更显专业,这就是我为什么选定VB的理由。下面正式进入正题。
       用VB编程需解决的三个问题:
       1、如何操作注册表。操作注册表的方法通常是运用API来进行实现,本文主要运用VBS对象方法操作注册表。
       读、写注册表自定函数源码如下:
  1. Option Explicit
  2. '定义脚本对象
  3. Private ER_CrpShell As Object
  4. '------------------------------------------------------
  5. '功 能: 读取注册表指路径键值
  6. '输 入: strRegKey 字符串变量,指定注册表键值路径
  7. '输 出:  RegRead 长整型变量,输出所获得键值
  8. '------------------------------------------------------
  9. Public Function RegRead(strRegKey As String) As Long
  10. On Error Resume Next
  11. Set ER_CrpShell = CreateObject("WScript.Shell")
  12. RegRead = ER_CrpShell.RegRead(strRegKey)
  13. Set ER_CrpShell = Nothing
  14. End Function

  15. '------------------------------------------------------
  16. '功 能: 在指定注册表路径写入键值
  17. '输 入: strRegKey 字符串变量,指定注册表键值路径
  18. ' intRegVal 整型变量,输入键值
  19. '输 出: 无
  20. '------------------------------------------------------
  21. Public Function RegWrite(strRegKey As String, intRegVal As Integer)
  22. On Error Resume Next
  23. Set ER_CrpShell = CreateObject("WScript.Shell")
  24. ER_CrpShell.RegWrite strRegKey, intRegVal, "REG_DWORD"
  25. Set ER_CrpShell = Nothing
  26. End Function
复制代码
       2、智能读取Access版本号(适用于2003及以前版本)。只有实现智能读取Access版本号,才能确保项目发布中根据每台机子所安装的Access版本不同,而正确找到键值所在位置。
       智能读取Access版本号源码:
  1. Dim strRegSec As String '字符串变量,安全设置键值所在注册表路径
  2. Dim strVer As String '当前ACCESS版号字符串变量
  3. Dim objWord As Object 'Word对象变量

  4. On Error Resume Next

  5. '创建Word对象
  6. Set objWord = CreateObject("word.Application.8")

  7. '获得当前office版号
  8. strVer = objWord.Version

  9. '退出Word,并释放内存
  10. objWord.Quit
  11. Set objWord = Nothing

  12. '将注表路径赋值给变量
  13. strRegSec = "HKEY_CURRENT_USER\Software\Microsoft\Office" & _
  14. strVer & "\Access\Security\Level"

  15. 'RegWrite 自定义函数,用以写入键值操作
  16. '键值1为低,2为中,3为高
  17. RegWrite strRegSec, 1
复制代码
源码说明:
       获取ACCESS版本号的通常方法:通过返回ACCESS对象,再通过Version属性获取版号,详见源码:
  1. Dim strVer As String '当前ACCESS版号字符串变量
  2. Dim objAccess As Object 'Word对象变量

  3. '返回ACCESS对象引用
  4. Set objAccess = GetObject (,"Access.Application")
  5. '获得当前office版号,赋值变量
  6. strVer = objAccess.Version
复制代码
但此法需要一个前提,就是必须先启动ACCESS项目,换句话说也就是ACCESS处于启动状态,可这就回到了前面我们所说“能医不自医”的老问题上了。假如ACCESS设定了最高安全级别,而使ACCESS项目无法正常启动,也就无从通过其 Version 属性获取当前ACCESS的版本号。
       不过,好在OFFICE家族成员众多,别看ACCESS和EXCEL防犯严密,但百密终有一疏,我们可以通过避实就虚的方法,达成曲线救国之目的,也就是通过Word 来获取版本号。见如下源码:
  1. Dim strVer As String '当前ACCESS版号字符串变量
  2. Dim objWord As Object 'Word对象变量

  3. '创建Word对象
  4. Set objWord = CreateObject("word.Application.8")
  5. '获得当前office版号
  6. strVer = objWord.Version
复制代码
虽然,Word 也提供了宏安全级别设置,但经我测试,无论Word安全级别设置为什么级别,都不会影响它的正常启动,这就为我们获取版本号亮了绿灯,这也是为什么我在代码中用Word而不是Access的原因。
       3、VB编程启动ACCESS项目。本文主要讲的是通过Shell方法启动对象(注意必须引用 SHELL32.DLL 链接库)。源码如下:
       Shell 方法启动对象源码:
  1. Dim MsShell As New Shell '定义新的Shell类
  2. Dim isFile as String '文件所在路径

  3. '当前路径及mdb文件名
  4. isFile = App.Path & "\项目名称.mdb"
  5. '通过Shell打开指定mdb文件
  6. MsShell.Open (isFile)
复制代码
如果我们解决好了上述三个问题,那么我们就完全可以用VB建一个工程并编译EXE,来避开安全级别限制启动ACCESS项目就不难了。

                                                                                                                       作者:江羽   QQ308938181


Word文稿下载:


[ 本帖最后由 tanhong 于 2008-10-9 11:30 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2经验 +20 收起 理由
wang1950317 + 10
tmtony + 10

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2008-9-27 23:29:21 | 只看该作者
非常详尽,好贴,加分了
3#
发表于 2008-9-28 00:06:52 | 只看该作者
是不是要判断一下有没有安装合适版本的access?

启动access和安全级别无关吧?
4#
发表于 2008-9-28 00:11:42 | 只看该作者
我就让用户安装access,联连工作组文件(这个我无法不用手工去做),设安全级别为低,没有日历控件的注册一下.

一般装机是没有access的.所以再自动也没用.
5#
 楼主| 发表于 2008-9-28 00:11:58 | 只看该作者
回复tz-chf兄:
1、是不是要判断一下有没有安装合适版本的access?
回:这个已经通过代码解决,不是问题。

2、启动access和安全级别无关吧?
回:启动ACCESS不能说和安全级别无关,因为如果不提前将安全级别设置为最低,VB何以能顺利启动ACCESS。
6#
 楼主| 发表于 2008-9-28 00:23:11 | 只看该作者
原帖由 tz-chf 于 2008-9-28 00:11 发表
我就让用户安装access,联连工作组文件(这个我无法不用手工去做),设安全级别为低,没有日历控件的注册一下.

一般装机是没有access的.所以再自动也没用.


我们在发布项目的前提应默认其安装了ACCESS,不然何以运行项目,我想这是我们用ACCESS做项目开发平台这初不用多言的前提。

本文只是抛砖引玉,只是探究一个问题,即:如何让我们ACCESS项目做到更好。只是因本人文字粗陋,需要象tz-chf兄这样的高手多交流,多指点。在此容江羽就此谢过!
7#
发表于 2008-9-28 09:37:44 | 只看该作者
江版,此次王站长给你加分了,我就不加了,请原谅哟[:30]
8#
 楼主| 发表于 2008-9-28 10:45:32 | 只看该作者
今日我的生日,也不给见面礼呀![:34]
9#
发表于 2008-9-28 12:02:37 | 只看该作者
谢谢!
10#
发表于 2008-9-28 12:38:49 | 只看该作者
[:17]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-16 23:04 , Processed in 0.113056 second(s), 38 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表