D盘

workspace
posts - 165, comments - 53, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Oracle® Database Security Guide
 
Table 7-2 Default Accounts and Their Status (Standard Installation)
USERNAME ACCOUNT_STATUS

ANONYMOUS

EXPIRED & LOCKED

CTXSYS

EXPIRED & LOCKED

DBSNMP

EXPIRED & LOCKED

DIP

EXPIRED & LOCKED

DMSYS

EXPIRED & LOCKED

EXFSYS

EXPIRED & LOCKED

HR

EXPIRED & LOCKED

MDDATA

EXPIRED & LOCKED

MDSYS

EXPIRED & LOCKED

MGMT_VIEW

EXPIRED & LOCKED

ODM

EXPIRED & LOCKED

ODM_MTR

EXPIRED & LOCKED

OE

EXPIRED & LOCKED

OLAPSYS

EXPIRED & LOCKED

ORDPLUGINS

EXPIRED & LOCKED

ORDSYS

EXPIRED & LOCKED

OUTLN

EXPIRED & LOCKED

PM

EXPIRED & LOCKED

QS

EXPIRED & LOCKED

QS_ADM

EXPIRED & LOCKED

QS_CB

EXPIRED & LOCKED

QS_CBADM

EXPIRED & LOCKED

QS_CS

EXPIRED & LOCKED

QS_ES

EXPIRED & LOCKED

QS_OS

EXPIRED & LOCKED

QS_WS

EXPIRED & LOCKED

RMAN

EXPIRED & LOCKED

SCOTT

EXPIRED & LOCKED

SH

EXPIRED & LOCKED

SI_INFORMTN_SCHEMA

EXPIRED & LOCKED

SYS

OPEN

SYSMAN

EXPIRED & LOCKED

SYSTEM

OPEN

WK_TEST

EXPIRED & LOCKED

WKPROXY

EXPIRED & LOCKED

WKSYS

EXPIRED & LOCKED

WMSYS

EXPIRED & LOCKED

XDB

EXPIRED & LOCKED

posted @ 2008-10-24 10:23 巴西木 阅读(325) | 评论 (0)编辑 收藏

6.4  服务器和数据库角色

在7.0版之前,SQL Server有过组的概念——这是用户权限的分组,你只需简单地把用户分配到组中,就能一次指派所有这些权限。这里的组与Windows中的组起作用的方式有很大不同,用户能够属于多个Windows组,因此,可以根据需要混合搭配它们。在SQL Server 6.5(和更早的版本)中,每一个数据库里,一个用户只允许属于一个组。

SQL Server 7.0之前版本的这种方式产生的后遗症是,SQL Server组属于以下3类之一:

l    经常根据用户级别的许可权限对它们进行修改;

l    它们只是主要的组的微小变形;

l    它们拥有多于所需的访问权限(以便使DBA的工作更为轻松)。

基本上,它们虽然很有必要,但同时也是一个很大的麻烦。

伴随7.0版的出现,在这方面发生了一些很大的变化。现在,用户属于一个角色,而非一个组。在最一般的意义上,角色与组是相同的事物。

角色是一组访问权限的集合,通过简单地把用户分配到那个角色中,就能将这一组访问权限一起指派给用户。

在这里,相似之处逐渐消失。使用角色时,用户能够一次属于多个角色。由于能够把访问权限组织到更小的和更合理的组中,然后把它们混合搭配为最适合用户的规则,这简直令人难以置信的便利。

角色分为两类:

l    服务器角色;

l    数据库角色。

很快,我们还将看到第三种称为角色的事物——应用程序角色,尽管我希望微软选用另外的名字。这是一种特殊的方式,用来把用户化名到不同的许可权限组中。应用程序角色不是分配用户的,它是一种让应用程序拥有的权限集不同于来自用户的权限集的方法。由于这个原因,我通常不认为应用程序角色是真正意义上的“角色”。

服务器角色限制在那些当发布SQL Server时就已经建立于其中的角色,并且,它在这里主要是为了进行系统的维护以及授予完成非数据库特有的事情的能力,如创建登录账户和创建链接服务器。

与服务器角色很类似,这里有一定数目的内置(或“固定”)数据库角色,不过,你也可以定义自己的数据库角色,以满足你独特的需求。数据库角色用来进行设置,以及在一个给定的数据库中分组特定的用户权限。

接下来,我们分别来看这两种类型的角色。

6.4.1  服务器角色

所有的服务器角色都是“固定的”角色,并且,从一开始就存在于那里——自安装完SQL Server的那一刻起,你将拥有的所有服务器角色就已经存在了。

角  色

特  性

sysadmin

该角色能够执行SQL Server上的任何操作。本质上,任何具有这种角色成员身份的人都是那个服务器上的sa。这种服务器角色的创建为微软提供了某一天去除sa登录的能力——实际上,联机丛书把sa称作本质上为遗留物的东西

值得注意的是,在SQL Server上,Windows的Administrators组被自动映射到sysadmin角色中。这意味着服务器的Administrators组中的任何成员同时也具有对SQL数据的sa级别的访问权限。如果需要,你可以从sysadmin角色中删除Windows的administrators组,以提高安全性、防范漏洞

serveradmin

该角色能设置服务器范围的配置选项或关闭服务器。尽管它在范围上相当有限,但是,由该角色的成员所控制的功能对于服务器的性能会产生非常重大的影响

setupadmin

该角色仅限于管理链接服务器和启动过程

securityadmin

对于专门创建出来用于管理登录名、读取错误日志和创建数据库许可权限的登录名来说,该角色非常便利。在很多方面,该角色是典型的系统操作员角色——它能够处理多数的日常事务,但是,却不具备一个真正无所不能的超级用户所拥有的那种全局访问

processadmin

能够管理SQL Server中运行的进程——必要的话,该角色能够终止长时间运行的进程

dbcreator

该角色仅限于创建和更改数据库

diskadmin

管理磁盘文件(指派给了什么文件组、附加和分离数据库,等等)

bulkadmin

该角色有些怪异。它被明确创建出来,用于执行BULK INSERT语句的权限,否则的话,只能由具有sysadmin权限的人来执行BULK INSERT语句。坦白地说,我不明白为什么该语句不能像其他事情那样通过GRANT命令来授予权限,但它的确没有。要记住,即使把一个用户加入到了bulkadmin组中,也只是给了他们访问那个语句的权限,对于运行该语句的表,并没有授予用户访问那个表的权限。这意味着不仅需要把用户添加到bulkadmin中,而且,对于想要用户能在其上执行BULK INSERT的表,还要授予(GRANT)用户INSERT许可权限。此外,对于将在BULK INSERT语句中引用的所有表,还要确保用户拥有正确的到那些表的SELECT访问权限

对于在服务器上承担管理角色任务的单个用户,你可以对其混合搭配这些角色。一般来说,我怀疑只有最大型的数据库才会使用比sysadmin和securityadmin更多的角色,然而,有它们在旁边还是很便利的。

在本章的前面,我曾就全能用户会带来的麻烦进行过抨击。当新的sysadmin角色添加到7.0版时,我完全是欣喜若狂的,或许,得知此事你不会感到惊奇。sysadmin角色的存在表明,在不断发展的基础上,不再需要让所有人都有sa登录账户——只要让需要拥有那种访问级别的用户成为sysadmin角色的成员,这样他们就不再需要以sa登录。

6.4.2  数据库角色

数据库角色限制在单个数据库的范围之内——用户属于一个数据库中的db_datareader角色并不意味着他属于另一个数据库中的那个角色。数据库角色分为两个子类:固定数据库角色和用户定义数据库角色。

1.固定数据库角色

就如同存在若干个固定服务器角色一样,这里也有许多的固定数据库角色。他们中的一些有预先定义好的专门的用途,这是不能使用常规的语句复制出来的(即是说,你无法创建拥有同样功能的用户定义数据库角色)。然而,大多数角色的存在是为了处理更一般的情形,并让你做起事情来更加容易。

角  色

特  性

db_owner

该角色表现得就好像它是所有其他数据库角色中的成员一样。使用这一角色能够造就这样的情形:多个用户可以完成相同的功能和任务,就好像他们是数据库的所有者一样

db_accessadmin

实现类似于securityadmin服务器角色所实现功能的一部分,只不过这一角色仅局限于指派它并创建用户的单个数据库中(不是单个的权限)。它不能创建新的SQL Server登录账户,但是,该角色中的成员能够把Windows用户和组以及现有的SQL Server登录账户加入到数据库中

db_datareader

能够在数据库中所有的用户表上执行SELECT语句

db_datawriter

能够在数据库中所有的用户表上执行INSERT、UPDATE和DELETE语句

db_ddladmin

能够在数据库中添加、修改或删除对象

db_securityadmin

securityadmin服务器角色的数据库级别的等价物。这一数据库角色不能在数据库中创建新的用户,但是,能够管理角色和数据库角色的成员,并能在数据库中管理语句和对象的许可权限

db_backupoperator

备份数据库(打赌你不会想到那样一个角色!)

db_denydatareader

提供一种等同于在数据库中所有表和视图上DENY SELECT的效果

db_denydatawriter

类似于db_denydatareader,只不过这里影响的是INSERT、UPDATE和DELETE语句

与使用固定服务器角色很类似,除非是在最大型的数据库中,否则,你可能不会使用到所有这些角色。在这些固定数据库角色中,一些是无法用你自己的数据库角色来替换的,而另一些,只不过在处理那些似乎经常出现的简单粗糙的情形时非常便利而已。

2.用户定义数据库角色

实际上,可供使用的固定角色只是为了帮助你开始入手。安全性真正的中流砥柱是用户定义数据库角色的创建和分配。对于这些角色来说,由你来决定它们将包含什么许可权限。

使用用户定义角色时,可以像针对单独的用户那样,用完全相同的方式进行GRANT、DENY和REVOKE。关于使用角色,好的事情是,用户往往归入访问需要的范畴——通过使用角色,你能够在一个地方做改动,并将改动散播给所有类似的用户(至少被指派到那个角色的用户)。

  ● 创建用户定义角色

我们使用sp_addrole系统存储过程来创建我们自己的角色。其语法非常简单:

sp_addrole [@rolename =] <'角色名'>

[,[@ownername =] <'所有者'>]

role name只不过是想要用来称呼那个角色的名称。常见的命名模式的例子包括:以部门来命名(Accounting、Sales、Marketing等),或者以具体的工作来命名(CustomerService、Salesperson、President等)。使用这样的角色的确能够让向系统中添加新用户的工作变得容易。如果会计部门新近雇用了某人,你只需把他(或她)添加到Accounting角色中(或者,如果更加精确,甚至可以是AccountsPayable角色),然后,就可以丢开这件事了——无需研究“这个人应当具有什么权限呢?”

此处的owner与系统中所有其他对象上的owner是相同的事物。默认是数据库的所有者,并且,我强烈建议让它保持那样(换句话说,只需忽略这个可选参数即可)。

接下来,创建我们自己的角色:

当执行上面的语句时,将返回给你一个友好的消息,告诉你新的角色已经加入。

现在,我们需要为这个角色实际指派一些权限,以这种方式为这个角色增加一些价值。要完成这一任务,只需像本章前面对实际的用户所做的那样,使用GRANT、DENY或REVOKE语句:

现在,所有属于我们角色的人都拥有了到Territories表的SELECT访问权限(除非在他们的安全性信息中的其他地方有DENY)。

此刻,已经准备好添加用户了。

  ● 向角色中添加用户

有了所有这些角色固然不错,但是,如果没有把任何人指派给他们,则角色将没什么用处。向角色中添加用户非常简单,就是使用系统存储过程sp_addrolemember并提供数据库名和登录ID:

sp_addrolemember [@rolename =] <角色名>,

[@membername =] <登录ID>

关于该存储过程的参数,一切都是非常一目了然的,因此,我们直接进入一个例子。

先从证实TestAccount不具有到Territories表的访问权限开始:

果不其然,我们被拒绝了(眼下尚没有访问的权限):

现在,把我们的Windows用户TestAccount添加到OurTestRole角色中:

同样,我们收到一条确认消息,告知事情正确完成了:

此时,到了再次尝试并运行SELECT语句的时候了——这一次顺利得多(会得到大约53个返回行)。

  ● 从角色中删除用户

有起必有落,添加到角色中的用户势必也将从角色中删除。

从角色中删除用户的操作与把用户添加到角色中的操作几乎一样,只不过这里使用的是一个名为sp_droprolemember的不同的存储过程,使用的形式如下:

sp_droprolemember [@rolename =] <角色名>,

[@membername =] <安全账号>

接下来,返回到我们的例子,并从OurTestRole数据库角色中删除TestAccount:

你会收到另一个确认消息,告知一切顺利。现在,再试试我们的SELECT语句:

果然,我们又一次收到了说明我们没有访问权限的错误消息。

可以用这种方式向任何角色中添加用户以及从任何角色中删除用户——角色是用户定义角色还是固定角色并不重要,是服务器角色还是数据库角色也没什么关系。无论在什么情况下,它们的操作几乎完全一样。

还要注意的是,所有这些工作都可以在Management Studio中进行。要更改与角色相关联的权限,只需单击数据库结点的角色成员,然后使用复选框指派权限即可。当想要向角色中添加用户时,只需去到用户的属性对话框中,选择服务器或数据库角色选项卡,然后,在所有想要用户拥有其角色成员身份的角色上打上勾号。

  ● 删除角色

删除角色与添加角色一样容易。其语法很简单:

EXEC sp_droprole <'角色名'>

执行后,角色就被删除了。

6.5  应用程序角色

应用程序角色与数据库角色和服务器角色有些不同。的确,由于对它们都使用角色这一术语,这很容易让人觉得它们比较相近——但其实不是这样。

实际上,应用程序角色更像是用户的安全性别名。应用程序角色允许定义一个访问列表(由数据库单独的权限或分组构成)。另外,由于应用程序角色有其自身的密码,这让它们与用户有些类似。尽管如此,应用程序角色与用户登录名是不同的,因为应用程序角色不能那样“登录”——用户账户必须先登录,然后,他(或她)可以激活应用程序角色。

那么,我们为了什么而需要应用程序角色呢?为了应用程序——还有什么?你将经常遇到这样的情形,希望用户根据他(或她)在什么上下文中访问数据库而拥有一组不同的权限。使用应用程序角色,你能够实现这样的事情:只授予用户到数据库的只读访问权限(只能执行SELECT语句),但是,当用户在应用程序的范围内访问数据库时,还是会允许他们修改数据。

注意,应用程序角色是单向的。即是说,对于一个指定的连接,一旦确定已经激活应用程序角色,则对那个连接来说,无法再回到用户自己的安全性上下文。为了回到用户自己的安全上下文,他们必须终止这个连接,并再次登录。

应用程序角色的作用过程类似下面这样:

(1) 用户登录(很可能使用应用程序提供的登录窗口);

(2) 验证登录,用户获得了他(或她)的访问权限;

(3) 应用程序执行名为sp_setapprole的系统存储过程,并提供角色名和密码;

(4) 验证应用程序角色,然后,连接被切换到应用程序角色的安全上下文(失去了用户拥有的所有权限——现在,他(或她)拥有的是应用程序角色的权限);

(5) 在整个连接期间,用户将继续保持基于应用程序角色的访问权限,而非基于他(或她)个人登录名的访问权限——用户不能回到他或她自己的访问信息。

你只会想把应用程序角色作为真正的应用程序情形的一部分来使用,并且,你将直接在应用程序中构建设置应用程序角色的代码。另外,你也将需要把密码编译到应用程序中,或者把这一信息存储在某个本地文件中,以便在需要的时候进行访问。

6.5.1  创建应用程序角色

要创建应用程序角色,可以使用一个新的称为sp_addapprole的系统存储过程。该存储过程是另一个使用起来相当简单的存储过程,其语法如下:

sp_addapprole [@rolename =] <角色名>,

[@password =] <'密码'>

与本章中许多存储过程一样,其参数是一目了然的。因此,我们直接进入到它的使用,创建我们自己的应用程序角色:

'密码'

 

就是这样快,我们已经创建了应用程序角色。

6.5.2  向应用程序角色添加许可权限

向应用程序角色中添加许可权限与向任何其他事物中添加许可权限一样。只需在使用用户登录ID或者常规的服务器或数据库角色的地方,把它们替换成应用程序角色的名字即可。

同样,我们马上进入到一个例子:

现在,应用程序角色在Region表上拥有了SELECT权限——到此为止,它还没有任何其他的权限。

6.5.3  使用应用程序角色

应用程序角色的使用是这样一个过程:调用系统存储过程(sp_setapprole),并提供应用程序角色的名字和相应的密码。其语法如下:

sp_setapprole [@rolename =] <角色名>,

[@password =] {Encrypt N'密码}|'密码'

[,[@encrypt =] '<加密选项>']

role name就是你想要激活的应用程序角色的名字。

password或者原样提供,或者使用ODBC encrypt函数进行加密处理。如果准备加密密码,那么,需要在Encrypt关键字之后,用引号引住密码,并在前面放置一个大写的N——这向SQL Server表明,正在处理的是Unicode字符串,并且应当被如此对待。注意,为加密参数使用的是花括号{},而不是圆括号。如果不希望加密,则不必使用Encrypt关键字来提供密码。

仅当为密码参数选择了加密选项时,才需要使用encryption style(加密类型)。如果对密码进行了加密,那么以“ODBC”作为加密类型。

值得注意的是,只有在使用ODBC或OLE DB客户端时,才能使用加密选项。不能把DB-lib与加密一起使用。

接下来进入示例的讲述,我们从验证几件与TestAccount用户的状态有关的事情开始。本章到了这里(假设你逐一学习了所有的例子),TestAccount用户不能访问Region表,但是,能够访问EmployeeTerritories表。通过运行两个SELECT语句,可以验证这种状态:

从第一个SELECT语句中会得到一个错误,而第二个语句则会返回大约50行记录。

现在,激活我们前面创建的应用程序角色,使用TestAccount用户输入下面的代码:

执行完上面的语句后,会得到一个确认消息,告知你应用程序角色已经“激活”。

通过运行前面的两条SELECT语句进行测试——会发现原来能做的和不能做的事情完全反过来了。即是说,尽管TestAccount能够访问EmployeeTerritories,但在使用应用程序角色时,失去了这种访问权限。TestAccount对Regions表没有访问权限,但是,眼下,应用程序角色提供了这种访问权限。

对于当前的连接,无法终止应用程序角色,因此,你可以终止你的TestAccount连接。然后,使用Windows安全性为TestAccount创建一个新的连接。再次运行那两条SELECT语句,会发现恢复了以前的访问权限。

6.5.4  删除应用程序角色

当服务器上不再需要应用程序角色时,可以使用sp_dropapprole从系统中删除它。其语法如下:

sp_dropapprole [@rolename =] <角色名>

要从系统中删除我们的应用程序角色,只需发出下面的命令(从sa):

 







转自:http://www.17xie.com/read-105583.html

posted @ 2008-10-24 09:52 巴西木 阅读(1344) | 评论 (0)编辑 收藏

有个VB做的WebService客户端程序,一直是需要安装SOAP Toolkit 3.0后才能使用,所以客户需要安装两个安装包,一个是我这个程序,一个是SOAP Toolkit 3.0。

昨天终于下决心抽空研究怎么合并打包程序了,经历是曲折的:

1. 从微软官方下载到了soapsdk的再分发包:STK3Redist.EXE

2. 解压后发现里面是几个. msm文件(isapi3_files.msm,soap3_core.msm,winhttp51.msm)

3. 上网搜索 .msm文件的使用方法,结果有人说用installshield可以打开,打开后,看到里面有mssoap30.dll等文件, 可是打开后无法导出,只能合并到别的msm文件或msi文件中,试着合并到自己程序的msi文件中,提示出错,合并失败,并无错误描述。

4. 于是开始研究提取msm文件中的文件,将msm文件导出到一个空的msi文件中,然后试了两个提取msi文件的软件(Universal Extractor和MSI文件提取器0.66)均提取失败。

5. 无意中搜到《打包SOAP 》这篇文章,其中的内容起了决定性作用:

1.将msm文件拷贝到InstallShield安装目录下的Objects文件夹下,例如:Macrovision\IS11.5\Objects 

2.在InstallShield下,将相应的msm合并模块从上面的InstallShield objects/Redistributables选中(SOAP SDK Files ,SOAP SDK ISAPI Files和WinHTTP QFE Installer ) 

原来msm文件是这样用的呀

6. 选中打包以后,安装测试,晕,依然报错:

WSDLReader: Loading of the WSDL file failed HRESULT=0x80040154: Class not registered.(没有注册类别)


7. google上搜索这个错误,遇到了这篇文章

KBAlertz.com: Error message when you try to access a Web service that is hosted on IIS: HRESULT=0x80040154

其中讲到的一种情况与我这种情况一致:
You include the redistributable files from the Microsoft SOAP Toolkit 3.0 in the client program installation package.
三种解决办法中我用的是:
Method 3: Install Microsoft XML Core Services 4.0 Service Pack 2


8.于是我在installshield中选入了msxml4.0(本来也找好了MSXML4.0 SP2的包,结果用msxml4.0就解决了,每用上)

9.打包测试

10.成功!


总结:
首先,对于使用了soapToolkit3.0的客户端程序,必须注册需要的dll文件。
有人说只需要注册几个dll文件(MSSOAP30.DLL,MSSOAPR3.DLL ,WISC30.dll  ),没有精力去追究是不是这样了,而且这几个文件也不再同一个msm文件中,所以我把三个msm文件都加进去。
也有人说手动注册,但是对于安装程序来说,手动不再考虑之列。

然后,msm文件可以合并到别的msm文件或msi文件中。
虽然我没有试验成功,但msm文件的初衷大概就是为了模块化分发的,主要用于微软的msi安装包的制作。

其次,installshiel是可以将msm文件为我所用的
启发来自《打包SOAP》这篇文章

最后,对安装程序的测试一定要在空的操作系统上测试,不然,受到开发环境的影响,有些问题很难发现。
制作期间也遇到了一些别的问题,大多数是需要的文件没有打在包里,就像vb里面的richtext.ocx和msflxgrd.ocx,有些文件是可以在installshield中的Redistributables选取的,在Redistributables里没有提供的就得自己把文件加进去。




posted @ 2008-10-23 14:16 巴西木 阅读(4338) | 评论 (14)编辑 收藏

COM组件开发实践(一)

 Preface

      因为项目需要,开始从事ActiveX方面的工作,看了一些资料,可惜都是些COM原理方面的,没有切合实际动手的东西,在CodeProject上读完David Marcionek的文章【1】后,收获良多,但也遇到一些恼人的小问题,因此在其基础上就一些易错点做些小注解。本文版权归David Marcionek所有。

简介 

本文目的在于让你快速掌握ActiveX控件开发技术,将会展示开发ActiveX应该知道的基本概念,如方法,属性和事件,以及如何在一个ActiveX控件和一个web页面之间进行通信

在本文中,我们将创建一个ActiveX控件,当加载控件时,它会显示一个动画进度条,以便向用户表明控件正在加载。此控件会包含展示如何在控件和web页面间传递信息的功能。下面我们会使用VS2005一步步进行开发的。

创建一个ActiveX控件

为了创建一个ActiveX控件,如下所示:

1,创建一个"MFC ActiveX Control"项目,取名MyActiveX,

2,在"MFC ActiveX Control Wizard"对话框中,选中"Control Settings"

3,"Create control based on"中选择"STATIC".我们将使用静态控件,因为我们只是显示从控件中获取的输出信息,并不接受输入信息。

4,在"Additional features"中,确保"Activates when visible""Flicker-free activation"被选中,"Has an About box dialog"不选中。

5,默认情况下,wizard会创建一个项目,使其在一个共享DLL中使用MFC.我们必须更改这种情况,因为除非所需的MFC DLL都已经在系统中安装了,否则ActiveX控件就不能运行。包含ActiveX控件的Web页面上出现红叉的一个原因就是此。在项目的属性中,"Configuration Properties"-->"General",“Use of MFC” 改为“Use MFC in a Static Library”.

6,向导会创建如下几个类:

      1)CMyActiveXApp:这是ActiveX应用程序类,从COleControlModule类继承下来的。它是OLE控件模块对象继承自的基类,包含了初始化(InitInstance)和清理(ExitInstance)的代码

      2)CMyActiveXCtrl:COleControl继承而来,这里是我们实现控件大部分功能的地方。

      3)CMyActiveXPropPage:COlePropertyPage继承而来,用于管理控件的属性页对话框。向导已经为我们创建了一个默认的对话框来作为控件的属性页对话框。

增加动画GIF支持

      这里我们使用了一个CPictureEx类(具体代码见最后的资源部分),vs2005增加一个动画GIF资源有一个bug(其实在vs2008中也存在),我们可以使用下面这种技巧来回避它:

ProcessingProgressBar.gif拷贝到项目文件夹下,然后更名为ProcessingProgressBar.gaf在资源视图中,右键资源文件MyActiveX.rc,选择添加资源。在添加资源对话框中,按下导入按钮,并选择ProcessingProgressBar.gaf文件。在自定义资源类型对话框中输入“GIF”作为资源类型。这就会将GIF图片文件导入项目中。然后将导入的图片IDIDR_GIF1 改为IDR_PROGRESSBAR.

现在开始着手恢复原状,首先,打开MyActiveX.rc的源文件,找到IDR_PROGRESSBAR的定义,将其文件名改为 ProcessingProgressBar.gif”.同样地,把项目文件夹下的图片文件名也改回为“ProcessingProgressBar.gif”,最后在解决方案资源管理器视图中,选中ProcessingProgressBar.gaf,在其属性中,修改相对路径 ."ProcessingProgressBar.gif”.

增加对话框

      现在,我们为进度条图像增加一个对话框。

1, 资源视图中,右键对话框,选择插入对话框来创建一个默认的对话框。

2, 删除默认产生的确定取消按钮,调整对话框大小为230*40

3,更改对话框IDIDD_MAINDIALOG,并修改对话框属性:Border—none, Style – Child, System Menu – False, Visible – True.

4,在对话框中加入一个图片控件,调整其大小为200*20,更改控件IDIDC_PROGRESSBAR,颜色为“white”

5,为对话框创建一个类,名为CMainDialog,

 现在我们为类增加成员变量:

1,CMyActiveXCtrl类增加一个变量m_MainDialog,类型为CMainDialog

2, CMainDialog类增加一个变量m_ProgressBar,类型为CPictureEx,这里注意确保控件变量选中,并且对于的控件是”IDC_PROGRESSBAR”.

增加支持代码

好了,现在加入一些代码来绘制主对话框和进度条控件吧。

1,为CMyActiveXCtrl处理WM_CREATE事件的代码,在其中加入:

m_MainDialog.Create(IDD_MAINDIALOG, this);

并在OnDraw函数中加入:

m_MainDialog.MoveWindow(rcBounds, TRUE);
CBrush brBackGnd(TranslateColor(AmbientBackColor()));
pdc
->FillRect(rcBounds, &brBackGnd);

     2.CMainDialog类中,加入处理WM_CREATE事件的代码,在其中加入:

if(m_ProgressBar.Load(MAKEINTRESOURCE(IDR_PROGRESSBAR),_T("GIF")))
m_ProgressBar.Draw();

Ok,一个简单的ActiveX控件已经开发完毕,设置编译模式为“Release”模式,并构建整个应用程序。

创建一个Web页面作为ActiveX控件容器

      可以使用微软的ActiveX Control Pad。要利用它在Web页面中插入一个ActiveX控件,在<BODY>标记中右键,选择“Insert ActiveX Control”,选择你需要的就可以了。

 直接打开Web页面或者放到IIS服务器上进行访问,一切顺利的话就可以看到下面的图像: 

注1:前面要求设置编译模式为“Release”,其实是为了避免运行时因为触及Assert出错而做的,否则会报错如下:

 跟踪调试后会发现: 

  可以看出是图片扩展控件加载时的顺序有些问题,但在浏览器中并不需要考虑如此多,因此这里忽略此Assert条件。

 2:作者在这里没有对MyActiveX.idl文件进行讲解,我认为是一个不小的失误,也正是因为如此,才会导致一个很容易犯错的地方,当我们按照他的教程,仿照他的代码一步步进行完后,却发现在ActiveX测试容器中是可以运行通过的,但到了浏览器中却死活都是红叉叉。。。,就是因为作者忽略了其对MyActiveX.idl接口定义文件的修改进行解释。

注3:VS2008中没有ActiveX控件测试容器了,VS05以上的数字签名工具也改变了,因此使用VS2005可能更好

     我按照教程一步步模仿着做的时候,在上面这两点上纠缠了3个多小时才发现问题的原因。

     在下一篇文章中,将介绍如何对ActiveX控件进行数字签名并使其自注册和销毁来确保其安全性,此外还会介绍如何在ActiveX控件和Web页面间进行数据通信。

参考资源

1A Complete ActiveX Web Control Tutorial By David Marcionek

2. Add GIF-animation to your MFC and ATL projects with the help of CPictureEx and CPictureExWnd by Oleg Bykov, CodeProject.

 

 

posted on 2008-07-25 22:07 Phinecos(洞庭散人) 阅读(2004) 评论(6)  编辑 收藏 所属分类: C/C++/VC++COM/ATL/ActiveX




ActiveX发布步骤整理

1、数字签名。使用SignCode.exe进行数字签名,步骤如下:
首先要有工具包,包括以下几个软件:(c:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin目录下都有)
makecert.exe 制作cer格式的证书,即X.509证书,同时可以创建私钥
cert2spc.exe 将cer格式证书转换成spc格式证书,即PKCS #7证书
signcode.exe 将证书签署到ocx上去
chktrust.exe 检查签署证书后的ocx是否正确
还有一个certmgr.exe,是管理证书用的。可以从这里面导出root.cer来,网上很多文章写到这个证书,但是在VC的安装盘中却找不

到。其实,没有也没关系的。这几个软件可以从VC的安装盘中找到。

下面是具体的步骤:
1、创建一个自己的证书文件:
makecert /sv "wwx.PVK" /n "CN=yourcompant" wwx.cer
makecert /sv "wwx.pvk" /n "CN=公司名称,E=email,O=作者" wwx.cer
这里,Record.PVK表示新创建的私人密钥保存文件名
yourcompant是你想显示的公司名
wwx.cer是你创建最后的证书文件名
这些根据你自己的要求填写,最后得到wwx.PVK和wwx.cer两个文件。
其中,运行过程中需要输入私人密钥的保护密码,一定要输入一致,不要出错。

2、转换cer格式为spc格式(可以省略)
cert2spc wwx.cer wwx.spc
得到wwx.spc文件。

3、给ocx进行签名
运行signcode,命令行的我没有试验通过,我是通过界面实现的。
signcode运行后会出现数字签名向导,首先选择你要签名的ocx,下一步后会出现签名选项,一种是典型,一种是自定义。选择自定

义,这样才能从文件选择证书,选择前面制作的dream.spc,再下一步是
选择私钥文件,选择Record.PVK,输入私人密钥的保护密码,选择散列算法,一般用md5就可以了,下一步是选择其他证书,直接下

一步,填写一下这个控件的声明,用户用ie浏览的时候,会弹出证书说明,再下一步是加盖时间戳,如果需要,用以下地址:

http://timestamp.verisign.com/scripts/timstamp.dll 要求已经上网并能出国,然后直接下一步就完成了。

4、用chktrust检查是否正确
chktrust -v RecordProj.ocx

就这样,得到了一个测试证书,恩,虽然只是一个测试证书,但至少保证这个ocx在ie浏览的时候能够弹出来一个窗口,问你是否安装,而不是直接禁止了。

5、创建INF文件

[version]
signature="$CHINA$"
AdvancedINF=2.0

[Add.Code]
WebOffice.ocx=WebOffice.ocx
mfc70.dll=mfc70.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll

[mfc70.dll]
file-win32-x86=thiscab
FileVersion=7,0,9466,0
DestDir=11
RegisterServer=yes

[msvcrt.dll]
file-win32-x86=thiscab
FileVersion=6,1,9844,0
DestDir=11
RegisterServer=yes

[olepro32.dll]
file-win32-x86=thiscab
FileVersion=5,0,4522,0
DestDir=11
RegisterServer=yes

[WebOffice.ocx]
file-win32-x86=thiscab
clsid={05430EC0-69CA-437A-B1F9-4B78B8647BEA}
FileVersion=1,0,0,1
RegisterServer=yes
;

注意:如果基于MFC选择了静态编译就不需要配置动态运行库.

6、创建CAB文件
cabarc -s 6144 n WebOffice.cab msvcrt.dll msvcp70.dll msvcr70.dll mfc70.dll olepro32.dll ASYCFILT.DLL STDOLE2.TLB  WebOffice.ocx WebOffice.inf

使用Code Signing Wizard签署一个CAB文件
SIGNCODE.exe
时间戳服务:verisign的时间服务器,这个是免费的.http://timestamp.verisign.com/scripts/timstamp.dll

7、
完成后编辑网页ActiveX.htm

<object id=DWebOffice style="left: 0px; width: 100%; top: 0px; height: 450px;" classid="clsid:05430EC0-69CA-437A-B1F9-4B78B8647BEA" viewastext codebase="http://127.0.0.1:9000/ActiveX/WebOffice.cab#version=1,0,0,1">


注意网页中object标签codebase参数的URL地址和#version所指定的版本号

posted @ 2008-10-13 15:45 巴西木 阅读(422) | 评论 (0)编辑 收藏

How to configure a store proc automatically exec when SQL Server Services start

 

通过这个例子,我们将大致了解如何使用Raiserror抛出错误信息以及让SQLServer启动时自动运行存储过程.

 

1.先为我们的SQLServer增加一个错误号为50008message,然后我们就可以使用这个信息,在本例子中我们将会看到这个信息会被应用程序日志中:

SP_ADDMESSAGE 50008, 16,

    'The current database ID is:%d, the current date is: %s.'

GO

2.创建一个存储过程,此存储过程实现模拟一个错误处理过程,抛出错误号为50008的错误.

CREATE PROC UP_SETUPPROC

AS

   BEGIN

   DECLARE @DBID INT

   SET @DBID = DB_ID()

 

   DECLARE @TIME varchar(100)

   SET @TIME = convert(varchar,getdate(),110)

 

   RAISERROR (50008, 16, 1, @DBID, @TIME)

   WITH log

END

 

 

3.打开高级配置选项:如果不打开此选项,我们看不到很多高级的数据库配置选项.

EXEC SP_CONFIGURE 'SHOW ADVANCED OPTION',1

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.

THEN EXECUTE THE FOLLOW COMMAND:

RECONFIGURE

 

4.现在看一下当前的可以被配置的选项.

EXEC SP_CONFIGURE

 

可以看到与启动自动运行一个程序相关的选项是:

NAME                      MINIMUM     MAXINUM CONFIG_VALUE RUN_VALUE

scan for startup procs    0             1                 0                      0   

 

第一列是个选项的名字,下面的两个是这个选项的最小值和最大值,CONFIG_VALUE是当前的的配置值,RUN_VALUE是当前SQL Server

使用的值.

 

 

5.打开这个'scan for startup procs’选项,以使我们的SQLServer能够在启动时自动执行我们指定的存储过程:

          EXEC SP_CONFIGURE 'scan for startup procs',1

          RECONFIGURE

 

6:配置需要自动随SQLSERVER启动的存储过程,我们使用系统存储过程sp_procoption来进行设置,如下:

 

    sp_procoption @ProcName = 'UP_SETUPPROC', @OptionName = 'startup',

@OptionValue = 'true'

 

 

7:重启SQLServer Services:

                   START->RUN->CMD->NET STOP MSSQLSERVER

START->RUN->CMD->NET START MSSQLSERVER

 

9:查看应用程序日志:现在我们看一下我们的应用程序日志,就会发现我有一个Error number50008的的错误信息出现.

 

 

 

通过这个例子希望我们能够大致了解到RaiseError和怎么设置让一个存储过程随SQLServer 的启动而自动运行.

 

---Writen by 董晓涛



 如何在启动SQL SERVER的时候,执行一个存储过程?

被过滤广告  将存储过程创建在master数据库中,然后企业管理器中找到这个存储过程--右键--属性--勾选"每当sql server启动时执行"。

  --或者在master中创建存储过程后,执行语句设置为自动启动

  use master

  exec sp_procoption '存储过程名','startup','on'
---------------------------------------------------------------

自动执行存储过程

  SQL Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建,并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。

  对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。

  在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执行,请将启动参数指定为跟踪标记 4022。如果以最低配置启动 SQL Server(使用 -f 标记),则启动存储过程也不会执行。有关更多信息,请参见跟踪标记。

  若要创建启动存储过程,必须作为 sysadmin 固定服务器角色的成员登录,并在 master 数据库中创建存储过程。

  使用 sp_procoption 可以:

  将现有存储过程指定为启动过程。

  阻止过程在 SQL Server 启动时执行。

posted @ 2008-10-10 10:39 巴西木 阅读(1172) | 评论 (0)编辑 收藏

仅列出标题
共33页: First 9 10 11 12 13 14 15 16 17 Last