LongHorn 和 Yukon 的最新测试版

据悉,Microsoft 在 PDC 2003 上将向与会人员发放 Windows Longhorn PDC Build 4051(详细版本号:6.0.4051.0 (idx02.031001-1340),同时将在 BetaPlace 向测试人员发布一个新版本的 Yukon 测试版。 

看看这些精彩的 Longhorn Screenshots 吧。

安装过程: Setup Screen, Welcome to Windows Setup, CD-Key Entry, Which type of setup do you want?, Copying files for Setup

桌面:
Desktop w/ Default Wallpaper, Expanded Clock, Winver, Internet Explorer, IE Download Manager

墙纸:
Default – Bliss

另外,MSDN 订阅者下载站点上的 Office System 2003 的中文版,除了前几天出的 Office 核心组件外,Project/Project Server、Visio Profession、SharePoint Portal Server 2003 都有中文版了。据 Microsoft China 透露,简体中文版Microsoft Office System将于11月13日在北京正式发布。

我会做饭了

今天小试牛刀,亲自下厨,给自己做了碗蛋炒饭,还弄了份热气腾腾的咖喱牛肉,呵呵。虽然是第一次做饭,但功夫还算到家,就是忘了打开了抽油烟机,整个房子里面油气漫漫的,楼下的肯定认为我家失火了咧嘴笑脸

还得感谢Grace Zhang同志的提醒,不然我才懒得做饭呢,其实面条挺好吃的,何况我自己会做面条吐舌笑脸

其实呢,米饭是昨天Best Liang同志在我家蒸的,而咖喱牛肉也是Best Liang同志带来的,都不是我做的。我就是加了两个蛋及一点油,做成蛋炒饭,顺便热了一下咖喱牛肉。不过真的非常香呀。

昨天吃了顿大餐,在小白羊超市买了些肥牛、羊肉片及一些青菜,在家涮火锅吃。小日子真爽呀尴尬的笑脸

收到两个包裹了

今天早上接连收到两个包裹,第一个是Grace Zhange送来的健康小礼包,我十分喜欢里面的那个小袋子,呵呵,可以用来变魔术玩。吃了一个善存片,没有在说明书上看到如何吃,只写着口服,于是我就嚼着吃了,也没有喝水。

第二个包裹是续订的MSDN,为什么我知道是续订的呢,因为这回是DVD版的了,呵呵。

太棒了,又有新软件可以用了吐舌笑脸

 

首页及Logo设计

Aliy设计的三个Logos(待选ID从左至右分别为Aliy1,Aliy2,Aliy3):

Blahblah设计的两个Logos(待选ID分别为Blahblah 1,Blahblah2):

       

小新及其挚友设计的三个Logos(待选ID分别为小新1,小新2,小新3)

小新及其挚友合作设计的首页(待选ID为小新1):

小新及其挚友设计的首页2(待选ID为小新2)

征稿尚未截止,希望大家继续参与咧嘴笑脸,真诚的感谢以上朋友所做的贡献!!!!

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

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

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

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

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

关于KB的查询

我想很多搞MS技术的人,对于KB是十分依赖的。微软的KB是分级别的,比如供外部直接查询的、供合作伙伴级别查询的、供MS内部查询的。但很多MVP可能并不知道,MVPs有权查阅合作伙伴级别的KB。

查询地址就在http://mvp.support.microsoft.com,使用你已经注册的Passport,进入后,检查中英文知识库,即可以查阅到你想要的KB,注意一下,在一些KB内容中,文字背景为灰色的即为合作伙伴级别才可以访问到的内容。

Do more with less

How many people know this word: Do more with less? If you have seen Windows Server 2003’s AD, you will know this word. In Chinese it was “多快好省,稳如泰山”. But I think it should be “事半功倍”.

 

下午解决了一个问题

我们定制的基于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

一个在.net下进行用户模拟的类

实质上是通过WindowsIdentity.Impersonate()的方法,其中需要调用Win API来获得活用的Handle,用法其实很简单,因为在自己的代码中需要用到,就稍微封装了一下:

?public class IdentityImpersonation {

??[DllImport(“advapi32.dll”, SetLastError=true)]
??public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
???int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

??[DllImport(“advapi32.dll”, CharSet=CharSet.Auto, SetLastError=true)]
??public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
???int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

??[DllImport(“kernel32.dll”, CharSet=CharSet.Auto)]
??public extern static bool CloseHandle(IntPtr handle);

??// 要模拟的用户的用户名、密码、域(机器名)
??private String _sImperUsername;
??private String _sImperPassword;
??private String _sImperDomain;
??// 记录模拟上下文
??private WindowsImpersonationContext _imperContext;
??private IntPtr _adminToken;
??private IntPtr _dupeToken;
??// 是否已停止模拟
??private Boolean _bClosed;

??public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain) {
???_sImperUsername = impersonationUsername;
???_sImperPassword = impersonationPassword;
???_sImperDomain = impersonationDomain;

???_adminToken = IntPtr.Zero;
???_dupeToken = IntPtr.Zero;
???_bClosed = true;
??}

??~IdentityImpersonation() {
???if(! _bClosed) {
????StopImpersonation();
???}
??}

??public Boolean BeginImpersonate() {
?
???Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);
???
???if(! bLogined) {
????return false;
???}

???Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);

???if(! bDuped) {
????return false;
???}

???WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);
???_imperContext = fakeId.Impersonate();

???_bClosed = false;

???return true;
??}

??public void StopImpersonate() {
???_imperContext.Undo();
???CloseHandle(_dupeToken);
???CloseHandle(_adminToken);
???_bClosed = true;
??}
?}

?

使用示例:

IdentityImpersonation imper = new IdentityImpersonation(“tsg”, “123456”, “webreal”);
imper.BeginImpersonation();
// …
imper.StopImpersonation();