Exchange这东东…

这两天都在看Exchange的SDK,需要在ASP.NET页面里面对网络内另一台Exchange Server做一些操作,比如给指定域用户创建MailBox、进行帐号管理之类的。

想起Zee在他的Blog上说的,Exchange 2003简直愧对2003这个版本号,我现在总算是也体会了。虽然Microsoft什么产品都在向.Net靠拢,但是Exchange2003却没有任何.Net的接口,依然只能通过Com Interop来调用CDOEX、CDOEXM这些东东,和Exchange 2000相比没什么改变。于是,部门技术经理还是决定沿用Exchange 2000来做服务器。

昨天在Zee的帮助下,总算对Exchange编程有了一点点了解,今天又把SDK里面需要用到的几个Task的内容狠狠的看了一下,渐渐了入了门。Exchange SDK里面的例程几乎都是用VB调用COM组件的,我发现VB的确是一个好东东,把很多东西能够简化到这么容易的地步,尤其对COM的封装,VB的开发组真是厉害哦…笑脸

顺便也说说Active Directory(对Exchange Server远程操作也离不开AD),.Net里面虽然有一个专门的System.DirectoryService这个NameSpace包含了AD的一些东东,但是有时候还是直接通过DirectoryEntry的NativeObject属性直接得到ADSI里面的IADs接口对象,再直接操作ADSI来得爽。不然很多操作都得来Invoke,还不如直接点呢…

今天花时间把ObjectSpaces SDK看了一下

SDK是EAP(Early Adopters’ Preview)版本的,这个版本可以跑在.Net Framework 1.1下面。整个并不复杂,用法也很简洁明了。

/
    TableMappings.xml是一个描述表与实体对象的对应关系(表中的哪个字段对应实体对象的哪个Property)的xml文件。
    DataSource.xml是一个描述数据源信息(基本上就是给一个连接字符串)的xml文件。
    ObjectSpace类用来维护数据库与实体对象间的连接。
/
ObjectSpace os = new ObjectSpace(”TableMappings.xml”,”DataSource.xml” ) ;

/
    ObjectContext是一个维护实体对象的类
/
CommonObjectContext context = new CommonObjectContext(os.ObjectMappings);

/
    随手写的例子,一个Person类,假设已经定义好
/
Person kaixin = new Person();
kaixin.FullName = “开心”;
kaixin.Age = 27;

/
    把这个实体对象加入到ObjectContext对象中
/
context.Add(kaixin);

/
    通过ObjectSpace对象的Update()方法,把这个新增的实体对象写回数据库
/
os.Update(context, kaixin, UpdateOptions.Default);

/
    通过ObjectReader对象把数据库中所有FullName为’开心’的数据读出来
/
ObjectReader reader = os.GetObjectReader(context, new ObjectQuery(typeof(Person), “FullName = ‘开心’” ) ) ;

/
    遍历取出的数据,注意,从reader中取值不需要做Cast操作哦
/
foreach(Person p in reader) {
    Console.WriteLine(“Age of {0} is {1}.”, p.FullName, p.Age.ToString());
}

当然啦,如何在那个传进ObjectSpace构造函数的TableMappings.xml文件中定义好表与实体类,字段与属性的关系,是关键啦。这个文件中还可以定义Insert、Update、Delete用哪些StoredProcedure来处理等等,当然,也可以描述Parent-Child关系。

直接在这里打的代码中的双引号会自动转成全角的,呵呵。

今天才知有一个CollectionBase类,惭愧

今天看别人的一段代码,看到他的集合类都是通过继承CollectionBase类来实现的,赶紧看MSDN帮助,才发现.net已经提供了三个抽象的类来给我们继承以实现自定义的集合类:

CollectionBase  基本的集合类
ReadOnlyCollectionBase  只读的
DictionaryBase  基本的key-value集合类

惭愧惭愧,以前自己的代码中的集合类都是通过实现IList,然后通过聚合(内部的一个ArrayList)来实现,呜呜…

看来学习永无止境啊…努力!

下午解决了一个问题

我们定制的基于SharePoint Service的站点中的用户管理,在增加新用户时包含了两个动作:
1、通过.Net中的DirectoryService在相应的OU(我们给每个客户分配了一个OU,以便于管理)中增加一个用户;
2、把第1步创建的用户增加到当前SharePoint站点的用户中

在做第一步时遇到一个问题,因为新增用户这个操作是给用户站点的管理员进行的,而用户站点管理员这个用户帐号在服务器上并不是属于Domain Admin的角色,所以是没有通过Active Directory新增用户帐号的权限的。

解决方法是利用角色模拟,在需要新增域中的用户时,模拟一个具有这个权限的用户进行模拟,完成这个操作后,再结束模拟。

WindowsIdentity类是用来描述Windows用户的类,它有一个方法Impersonate(),可以模拟某一用户,但是它需要一个IntPtr类型的表示要模拟的用户的Token Handle来作为参数,这时需要用到Win API来得到这个Handle,所以自己又写了一个类来封装这个操作。

示范代码:
// IdentityImpresonation是自定义的用来表示用户模拟的类,构造函数
// 参数分别为:要模拟的用户的用户名、密码、所在域(或机器名)
IdentityImpersonation imper = new IdentityImpersonation(“tsg”, “123456”, “webreal”);
imper.BeginImpersonation();
// 进行某些操作
imper.StopImpersonation();

这个类的源码:http://blog.joycode.com/kaneboy/posts/3801.aspx

这几天都精神不济

每天都是很晚才睡,又一直有点感冒,所以这几天人都不是很精神,吃饭也提不起劲。

昨晚没呆在办公室,下了班吃了饭就跑去女朋友公司了,她在一家规模挺大的培训学校做老师,那家公司是属于典型的“包身剥削式”公司,每天老师晚上还得抽出时间跑到街边发学校的宣传单,昨晚帮她一起在街上发单,偶总是一次就给别人两份,嘿嘿,100份宣传单挺快就发完了,估计其中90张在半小时内都会被人随手扔掉。然后就手牵手送女朋友回去了。不久还是得帮她另找工作。

有人听说过微软的一个叫ObjectSpaces的类库吗?是一个做OR Mapping的东东。今天和MSN Messenger上的朋友谈到ORM,他提到了ObjectSpaces,于是在网上找了一下,好像微软很早就开始ObjectSpaces的开发了,在.Net Framework PDC Preview版出来后就发布了一个测试的版本,但.Net Framwork正式发布后,反而没有消息了。现在微软正式的说法是,还在开发之中,可能2004年面世。

找到了ObjectSpaces的安装文件,可惜它只认.Net Framework PDC Preview版,呵呵,没法安装,看了一下例子,是包含在Microsoft.ObjectSpaces命名空间里面的,没仔细研究。说不定微软早把这个产品Over掉了也说不定,呵呵。

不过网上倒是能找到不少.Net的ORM产品,有开源的,也有商业产品。奇怪,今天我又看不了SourceForge了,郁闷。

SharePoint的相关链接

随着新版本的发布,关照SharePoint的人应该会越来越多了。

SharePoint主页:
http://www.microsoft.com/sharepoint/

SharePoint Portal Server主页:
http://www.microsoft.com/office/sharepoint/prodinfo/default.mspx

SharePoint Service和SharePoint Portal Server有什么区别:
http://www.microsoft.com/sharepoint/evaluationoverview.asp

SharePoint开发中心:
http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28001891

SharePoint Service 2003 (2.0) 下载:
http://www.microsoft.com/downloads/details.aspx?FamilyID=e084d5cb-1161-46f2-a363-8e0c2250d990&DisplayLang=en

SharePoint Service 2003 SDK 下载:
http://www.microsoft.com/downloads/details.aspx?FamilyID=1c64af62-c2e9-4ca3-a2a0-7d4319980011&DisplayLang=en

SharePoint Portal Server 2003 Eval Edittion:
http://www.microsoft.com/downloads/details.aspx?FamilyID=16006564-4575-4463-920d-c920b4aeae64&DisplayLang=en

SharePoint Portal Server 2003 Administrator’s Guide:
http://www.microsoft.com/downloads/details.aspx?FamilyID=16006564-4575-4463-920d-c920b4aeae64&DisplayLang=en

SharePoint University :
http://www.sharepointu.com/

以前SharePoint服务叫SharePoint Team Service,新版叫Team Service 2.0,后改名为SharePoint Service 2003,后来把核心服务集成进了Windows Server 2003,就叫做Windows SharePoint Service。

SharePoint Service里面的东东真让人头疼

今天想利用它自带的DiscussionBoard功能接口来实现一个讨论板,SharePoint的对象模型总是有点奇怪,而SDK文档里面除了有一点说明对文档的操作的文章之外,既没有如何利用对象模型操作DiscussionBoard的文章,只能根据对象的Reference手册来猜测了…晕啊…

介绍一下SharePoint

有个朋友让我谈谈SharePoint2003的文件存储机制,正好这个月一直在做与SharePoint相关的工作,随便说说吧。有对SharePoint很熟悉的朋友也可以对我的理解加以指导和纠正。

SharePoint这个词包含两个东东,一个是Team Service,这是一些服务,提供了方便的站点、文档等东东的管理,以编程接口的方式提供,我们可以直接通过其SDK来调用其服务,现在最新的2003版已经集成进Windows Server 2003了(通过Windows Update就可以安装,或者去MS网站上下载),名字也叫做Windows SharePoint Service 2.0了。

另外一个就是Portal Server,这是一个可以直接建立门户站点的东东,安装上以后,通过其Adminstration Center,就可以直接在IIS的虚拟主机上直接建立站点,并把诸如文档库、列表、论坛等模块加入到站点中。最新的版本是Portal Server 2003,MS中国站点首页上已经有中文版的广告了。

其实上,Portal Server也是调用后面SharePoint Service的接口,只不过把站点的模板都做好了,可以直接拿来用了。Portal Server定义了一种CAML,用来描述站点页面模板。不过偶自己的感觉是是这个东东并不方便,改Portal Server的模板太麻烦了。

SharePoint Service是免费的,Portal Server是要钱的(估计价格不会很低)。

SharePoint里面一个很有特色的东东是WebPart,实质上就是一个CustomControl,特别的是,它可以在Portal Server的站点上,由用户自定义把一个WebPart放在页面上。

SharePoint把所有的东东都存放在Sql Server 2000里面的,文档、图片…只不过通过编程接口可以以更直接的比如SPFolder、SPFile对象把他们当作文件夹、文件来处理(实际上站点服务器上是不会真的给你建立这些文件夹、文件的,都存放在数据库里面)。如果以单服务器模式安装Portal Server,它会自动给你装上一个MSDE。

另外顺便提一下,好像现在在web程序中使用Access的情况是越来越少了,以前ASP时代,很多程序都用Access来保存数据,现在越来越多的是宁愿用MSDE,少量数据则用xml。