任务稿:IIS6+SSL Based On 2k3

IIS提供了SSL安全加密传输功能,如下配置:

1、证书请求文件生成:

进入“控制面板→管理工具→Internet 信息服务(IIS)管理器”,在IIS管理器窗口中展开“网站”目录,右键点击要使用SSL安全加密机制功能的网站,在弹出菜单中选择“属性”,然后切换到“目录安全性”标签页,接着点击“服务器证书”按钮。在“IIS证书向导”窗口中选择“新建证书”选项,点击“下一步”,选中“现在准备证书请求,但稍后发送”,接着在“名称”栏中为该证书起个名字,在“位长”下拉列表中选择“密钥的位长”,这里要注意,位长不能设置的过大,否则会影响通信质量;接着设置证书的单位、部门、和地理信息,在站点“公用名称栏”中输入该网站的域名,然后指定证书请求文件的保存位置,这里笔者将该证书请求文本文件保存在 “certreq.txt”。这样就完成了证书请求文件的生成。

2、安装证书服务:

在“控制面板”中运行“添加或删除程序”,切换到“添加/删除Windows组件”页,在“Windows组件向导”对话框中,选中“证书服务”选项,接下来选择CA类型,这里笔者选择“独立根CA”,然后为该CA服务器起个名字,设置证书的有效期限,建议使用默认值“5年”即可,最后指定证书数据库和证书数据库日志的位置后,就完成了证书服务的安装。

3、使用证书请求文件申请证书:

运行Internet Explorer浏览器,在地址栏中输入“http://localhost/CertSrv/default.asp”。接着在“Microsoft 证书服务”欢迎窗口中点击“申请一个证书”链接,然后在证书申请类型中点击“高级证书申请”链接,在高级证书申请窗口中点击“使用BASE64编码的 CMC或PKCS#10文件提交…”链接,接着将证书请求文件的内容复制到“保存的申请”输入框中,这里笔者的证书请求文件内容保存在 “certreq.txt”,最后点击“提交”按钮。虽然完成了IIS网站证书的申请后,但这时它还处于挂起状态,需要颁发后才能生效。

4、颁发证书:

在“控制面板->管理工具”中,运行“证书颁发机构”程序。在“证书颁发机构”左侧窗口中展开目录,选中“挂起的申请”目录,在右侧窗口找到刚才申请的证书,鼠标右键点击该证书,选择“所有任务→颁发”。

5、备份证书:

打开刚刚颁发成功的证书,在 “证书”对话框中切换到“详细信息”标签页。点击“复制到文件”按钮,弹出证书导出对话框,一路下一步,在“要导出的文件”栏中指定文件名,这里笔者保存证书路径为“backup.cer”,最后点击“完成”。

6、使用证书:

进入“控制面板->管理工具->Internet 信息服务(IIS)管理器”,在IIS管理器窗口中展开“网站”目录,右键点击要使用SSL安全加密机制功能的网站,在弹出菜单中选择“属性”,然后切换到“目录安全性”标签页,接着点击“服务器证书”按钮。使用“IIS证书向导”窗口配置SSL,注意端口的选择,默认443。

关于C#一个基础问题的初步探查

关于C#一个弱弱问题的初步探查

在书上看到这样一个例子:

已知:
interface IControl
{
void Paint();
}
class Control : IControl
{
public void Paint(){ ... }
}
class TextBox : Control
{
new public void Paint(){ ... }
}

问:
IControl it = new TextBox();
it.Paint(); //调用哪个Paint()?

书上的结论是Control::Paint(),并且吹了一通什么没有virtual关键字或者让TextBox直接继承至IControl就是静态决议,什么如果Control::Paint()加上virtual又怎么怎么,如果TextBox::Paint()去掉new又怎么怎么,感觉甚是繁琐、复杂和多变,让人如坠万丈深渊,万劫不复…(- -)

就我原来从C++带来的理解:IControl是个interface,其实隐含IControl::Paint()是abstract 以及 public,只是不能显式写出;所以成员函数的调用决议应该是运行期完成,也就是说为TextBox::Paint();

实际上机测试结果,令人汗颜,他的结果的确是正确的,但是他的后续所有解释都是错误的;不管如何加virtual、去掉new,最后的结果都是一个—Control::Paint(),程序代码如下:
using System;
namespace TestInterface
{
interface IControl
{
void Paint();
}
class Control : IControl
{
public void Paint()
{
Console.WriteLine("Control::Paint()");
}
}
///

/// TextBox 的摘要说明。
///

class TextBox : Control
{
new public void Paint()
{
Console.WriteLine("TextBox::Paint()");
}
}
///

/// TestInterface 的摘要说明。
///

class TestInterface
{
///

/// 应用程序的主入口点。
///

[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
IControl it = new TextBox();
it.Paint();
}
}
}

如果去掉new当然仅仅会导致警告,实际上还是覆盖。

书中还提到“我们的误解来自一个假设:Control::Paint()被自动视为vitrual”,根据实际上机测试,这个假设的确是成立的,而不是什么误解,至于加上virtual和去掉virtual所带来的区别仅仅在于是否加入关键字final。如果没有加上了virtual,那么Control::Paint()会自动视为final(IL中),有例为证:

Contorl::Paint()
.method public hidebysig newslot virtual final //如果加上vitrual则这里去掉final
instance void Paint() cil managed
{
// 代码大小 11 (0xb)
.maxstack 1
IL_0000: ldstr "Control::Paint()"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method Control::Paint
TextBox::Paint()
.method public hidebysig instance void Paint() cil managed
{
// 代码大小 11 (0xb)
.maxstack 1
IL_0000: ldstr "TextBox::Paint()"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method TextBox::Paint

而在Main()中仅是简单调用IControl::Paint()

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// 代码大小 13 (0xd)
.maxstack 1
.locals init ([0] class TestInterface.IControl it)
IL_0000: newobj instance void TestInterface.TextBox::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: callvirt instance void TestInterface.IControl::Paint()
IL_000c: ret
} // end of method TestInterface::Main

===== 华丽的分割线 =====
呵呵,以上就是我初步的分析,特别混乱,不要见笑,下面我做个总结(个人意见、仅供参考)

原来的C++到C#,在函数重载这一块有一个很明显的区别,那就是override关键字。如果重载必须显式的指明override关键字,如果没有,将隐藏基类成员。这点是很自然的,但是本例的特别之处在于interface的引入。

—– interface —–
interface默认为abstract类,但是和普通abstract类不同的是,他并没有派生自System.Object;其内接口也默认为abstract virtual如下:

.class interface private abstract auto ansi IControl
{
} // end of class IControl
.method public hidebysig newslot abstract virtual
instance void Paint() cil managed
{
} // end of method IControl::Paint

之所以interface被默认为public(指其内接口,而interface本身可以不为public),abstract就不用解释了,但是明示出来反而会出错;
—– interface end —–

—– interface implement —–
.class private auto ansi beforefieldinit Control
extends [mscorlib]System.Object
implements TestInterface.IControl
{
} // end of class Control
.method public hidebysig newslot virtual final //如果加上vitrual则这里去掉final
instance void Paint() cil managed
{
// 代码大小 11 (0xb)
.maxstack 1
IL_0000: ldstr "Control::Paint()"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method Control::Paint

这里太有趣了(- -,过分了…还是说稍微有点意思)interface接口的实现会在IL中自动加上virtual关键字,而不像刚才书上说的,什么误解,这是为什么呢?因为如果像本例中一样,用IControl调用Paint(),而IControl本身是不会实现Paint()的,所以他的实现必须在IL中以virtual关键字标明,让动态决议的时候,能够考虑到这个实现,不然IControl::Paint()的调用就会出问题。

至于这里提到的final,也是interface implement比较独特的一点。override会使得本身重载基类成员,并且本身成为virtual,所以自己的子类也可以重载自己。在程序中,若想重载基类成员,但又不想让子类继续重载,就会使用override sealed关键字,这里IL中的final关键字实际上就是指的sealed。

由此,我们一般写一个函数:

public void foo();

子类都无法override,除非函数改为:

virtual void foo();

但是这里由于interface implement本身需要申明为override(IL中仍为virtual),所以为了延续惯例,用sealed(IL中为final)封闭之,除非你显示的指示virtual,这样就和我们通常的观念保持一致鸟~~~~
—– interface implement end —–

—– extended classes —–
.class private auto ansi beforefieldinit TextBox
extends TestInterface.Control
{
} // end of class TextBox
extends TestInterface.Control
.method public hidebysig instance void Paint() cil managed
{
// 代码大小 11 (0xb)
.maxstack 1
IL_0000: ldstr "TextBox::Paint()"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method TextBox::Paint

这里不管你是否采用new关键字,实际上都起到了覆盖的作用,只是如果没有new关键字会引发警告,提醒你是否确实是想覆盖,如果你想关闭警告,就必须显示的告诉编译器我想覆盖—就是使用new关键字。

值得一提的有两点:
1、如果程序中直接写virtual而不用override,其实还是覆盖。可以从IL中看出:
程序<->IL
virtual<->newslot virtual
override<->virtual
2、如果这个类直接多重继承IControl,像这样:
class TextBox : Control, IControl
{
...
}

实际上这个类就不再属于extended classes了,而是interface implement。由于对于interface implement的选择是virtual的,所以很自然会调用TextBox::Paint();
—– extended classes end —–

如果以上的讨论正确,本例就很好解释鸟~~~

IControl::Paint()由于是virtual,他会先行寻找可行函数,再进行最佳决议;

由于new关键字的覆盖函数并未override,所以他连可行函数都算不上。自然无论如何都不可能被调用。相反,可能函数只有Control::Paint();

如果让TextBox::Paint()用override修饰(自然Control::Paint()需要用virtual修饰),那么可能函数有Control::Paint(),TextBox.Paint(),其中根据动态决议,最佳为TextBox.Paint();

ZTMD宁愿重写,也不排错

奋战了一个星期的简易登陆系统排错,最后的结果让人汗颜:
将Web.Config里面的
<authentication mode="Windows">
</authentication>

改为
<authentication mode="Forms">
<forms name="TheSky" path="/" loginUrl="/TheSky/WebModules/Users/Login.aspx" protection="All" timeout="30">
</forms>
</authentication>

我一直没有查Web.Config。唉,已经欲哭无泪了,呜呜…

ps:ztmd,ztmD,ztMd,zTmd,Ztmd,ztMD,zTmD,ZtmD,zTMd,ZtMd,ZTmd,zTMD,ZtMD,ZTmD,ZTMd,ZTMD

假期意识流

意识流

—假期生活乱纪

这个假期不堪回首,单调得可怕,除了4本书之外,记忆中仅存的就全是某大学的研究生会的网站了。网站说来更不堪回首,完全算得上“赶鸭子上架”的典型(我“可爱”的姐在网站“八字还没有一撇”的时候,居然就敢将“网站建设费”挥霍一空,后来备受挫折后,无力还债,于是栽赃到了我的头上- -!)。下面将网站建设过程中的点点滴滴乱纪下来,想到哪里写到哪里,逻辑未免混乱,各位大虾莫要见笑。目的也很简单,让各位看看一个新手眼中的网站建设过程。

1、 研究生会:

因为这个网站,我就已经堂而皇之成为某大学研究生会编制中的一员,这种“海纳百川”的“气势”令我无不拜倒- -!

2、 网站需求:

刚开始的网站需求很“明确”—“美观、大方、展现当代研究生风采”。让我感到在这种“派头”的指导老师手下干起事情来一定比较“自由”,但是后来事实证明我错了,这种指导老师也有开始变“聪明”的时候。

需求增加了一条—“采用最新的Asp.Net技术,并且务必使用SQL Server最新版本”,我在深入理解这条需求之后,对于各个软件、框架的版本甚是犹豫,不知beta版是否也计算在内- -!

3、 美工:

这个我没有发言权,反正阿梅和阿楠看过(因为当时我不会用PS分页- -!)

4、 VS .NET环境:

由于以前习惯于Borland的BCB,于是“疏”在于没RAD就不活了,“密”在于任何东西都希望有根有据,简单明了。对于VC++6.0从未涉猎,因为当时第一印象就觉得不像是拿来编程的,加之MFC的封装没有一定的实力,定会感到极其莫名其妙,那消息映射的编程方式更是使得局势错综复杂,不像VCL里面虽然依然有很多不懂,但至少容易把握过程。

介于上述原因,所以当我观之Visual Studio .NET的时候还是大吃一惊,惊叹微软也终于RAD了一把。于是看了本《C# Primer》上手就干。

但是现实总是残酷的,虽然很多东西感觉用起很顺手,但还是有很多极其不习惯:

首当其冲的就是一个解决方案里面的类、函数等等,不用.h,不用#include好像就能够在各个文件中可见,原因可能是采用namespace的组织方式,但是老是觉得没有#include <*.h>就是不爽(我理想中的世界应该是把文件include过来后,再在namespace里面避免污染,而不要在一个解决方案里面的文件到处都可见似的)。

其次就是所谓的大名鼎鼎的“Code Behind”,这个倒是在很大程度上解决了网页程序设计中的版权问题,并且使代码和外观分离,便于和传统窗口编程靠拢。但是对于新手而言,在不具备驾驭的能力的情况下,无非是场灾难,代码直接生成DLL,不用export,不用声明,只需assembly一下,就可以使用,随便咋看都极其莫名其妙。

介于以上,我终于放弃了使用VS .NET,本来想选择同出Borland之手的C# Builder,但是令人郁闷的是没有找到注册码- -!所以最后我还是选择了以前写ASP程序时候采用的Dreamweaver+EditPlus+MSDN,本来记事本足已,但是少了调试器,要是连行号都看不到,那我还是直接跳楼算了。

5、 风格:

回头看我写的代码,感觉很多地方看起来还是像用ASP写的:P,不过因为毕竟是ASP.NET的东西,还是初步感受了一下ASP.NET的便利,诸如:DataGrid、DataList、Page_Load、还有在连接SQL数据库时候的便利等等等等。

6、 语言:

这个是我最无语的一点,由于C# 是刚学的,所以开始的时候还是在尝试VB,在花了很长时间都没有发现下面代码为什么通不过之后,我还是痛下决心用C# 吧- -!

#region code
<script language=”VB” runat=server>
sub foo(object sender,eventargs e)
{
//----------
}
</script>
#endregion

接踵而来的转化工作,幸好还不算很困难,但确实很烦,下面将我在转化时的主要工作总结一下:

a) 大小写:VB里面的标识符不区分大小写,如:page_load、datagrid也可以通过,但是到了C# 里面就必须区分大小写了(这里是改得最郁闷的了,对照到MSDN一个一个挨到改,想当初写VB Script的时候不偷懒就好了)

b) 索引(Item):VB里面使用object(index)就可以索引了,但是到了C#里面索引可必须使用object[index]符号,不过如果你使用Item调用就一致了,不过新手一般都不会那样做。

其他可能还有很多转化工作,不过我倒是幸运的没有碰到。

7、 基本代码组织方式:

由于那个网站大量的都是带图像文本处理,所以基本上前台采用的是把分页后形成的静态页面里面的动态部分挖空,以iframe填充之,iframe的src里面要不就指向list.aspx文件(显示前多少项,以及more按钮),并传入类别、css、行数、列数作为参数控制外观;要不就指向multilist.aspx文件(显示所有内容,以DataGrid进行分页控制),传入的外观控制参数一致。并且二者都接受hot=1参数,若设置了,则排序的方式由order by subdate desc变为order by 点击次数 desc

8、 前台:

前台如前述方式架构,我觉得最有用的就是DataGrid与DataList的基本使用及外观控制,如果实在觉得不方便,新手还是用<ItemTemplate>来得快:),另外在进行数据绑定的时候,我基本上就只用到了下面一条语句:

<%# ((DataRowView)Container.DataItem)["foo"] %>

9、 后台管理:

a)FreeTextBox:

说起后台管理自然想到了熟悉的DormForce Blog的后台,那里的那个输入控件,令人感觉甚爽,在IE里面察看源,发现名字叫做FreeTextBox- -!这个名字实在是…

于是Google后下载了一个,感觉封装得很好,使用也很方便,直接register就可以用了,令我倍感ASP.NET还是很爽的,也对Web Control产生了一丝眷恋。但是问题也出来了,他的“插入图片”按钮令人极其郁闷,只能插入图片URL,而没有提供上传,本来想在FTB控件旁边单独提供一个UploadImg按钮,提供上传然后返回URL,供使用FTB插入之需。

但是在看了“宝玉”的文章后突然发现FTB对于Button提供了接口ToolBarButton,于是可以把上传的工作集成到按钮里面。用宝玉提供的方法,在VS .NET里面“依样画葫芦”很快便搞定了,其实就是直接从ToolBarButton直接继承构造新的Button就可以了。

但是问题是我没有用Code Behind的方式,而且找了半天也没有发现,如果不用Code Behind,把类的定义写在哪里?所以只有自己想办法,看了半天英文版的FTB帮助,终于找到了方法:

<FTB:TOOLBARBUTTON title="插入图片"
runat="server" ScriptBlock="myOpenFunc();" ButtonImage="insertimage" />

其中的ButtonImage指定名称后会自动从aspnet_client目录调用图片资源,若要更换可以直接替换文件即可,不过注意保持长宽比(不然会很难看的)。另外我感觉aspnet_client这个名字很可疑,可能有特殊的用途,诸如用于客户端的啥子东西,没有敢改名字:(

其中的ScriptBlock直接在FTB生成的Html页面里面加入内容,如上例就生成如下咚咚:

… = new FTBButton(… function(){myOpenFunc();} …)…

myOpenFunc()为调用此FTB控件页面上<script>内定义的函数。藉由此实现runat=server代码对于本机函数的调用,即通常所谓的Response.Write法。

另外,我还需要从本机函数调取runat=server中控件的属性。想了半天,找到了如下的不是办法的办法:

function myOpenFunc(){
var dt=eval('myForm.myDataTable');
var tempurl='../inc/uploadimg.aspx?tab=';
tempurl = tempurl+dt.value;
window.open(tempurl,'_uploadimg','width=300 height=50');
}

其中myForm、myDataTable分别为runat=server里面Form和DropDownList的Id名称,使得本机获得的html页面里的form和select的id为这二者,从而为本机函数的实现提供可能性。

在uploadimg.aspx中只需完成上传文件,调用opener.top.InsertText(…)方法传入图片地址即可,而在myOpenFunc()所在页面中定义InsertText方法完成插入。

b) 编辑区域:

编辑区域的实质,宝玉已经说得比较清楚了,其实就是一个document.designMode设为on的Iframe。因此可以方便的用本机函数进行各种编辑工作以及调用focus()获取焦点。

c) DropDownList的数据绑定:

由于需要,选定一个DropDownList后要对另外一个重新进行数据绑定,实现方式如下:

指定DropDownList的属性OnSelectedIndexChanged=”SelectionChangeFunc” AutoPostBack=”true”,SelectionChangeFunc会传送给一个delegate型别从而起到类似函数指针的作用。

void SelectionChangeFunc(Object sender, System.EventArgs e)
{
myDataClass.DataSource = CreateDataSource(...);
myDataClass.DataTextField = "TextField";
myDataClass.DataValueField = "ValueField";
myDataClass.DataBind();
myDataClass.SelectedIndex = 0;
}
ICollection CreateDataSource(…)
{
System.Data.DataTable myDt = new System.Data.DataTable();
myDt.Columns.Add(new System.Data.DataColumn("TextField", typeof(String)));
myDt.Columns.Add(new System.Data.DataColumn("ValueField", typeof(String)));
...
myDt.Rows.Add(CreateRow("…", "…", myDt));
...
System.Data.DataView myDv = new System.Data.DataView(dt);
return myDv;
}
System.Data.DataRow CreateRow(String Text, String Value, System.Data.DataTable dt)
{
System.Data.DataRow myDr = dt.NewRow();
dr[0] = Text;
dr[1] = Value;
return myDr;
}

d) DataGrid的CommandButton:

column字段:<asp:ButtonColumn HeaderText="Del Button"
Text="Del" CommandName="DelBtn" />

指定DataGrid属性OnItemCommand=”Grid_DelCommand”

通过Grid_DelCommand函数处理所有的CommandButton信息,而Grid_DelCommand函数只需根据CommandName指定的值选择操作即可。

void Grid_DelCommand(Object sender, DataGridCommandEventArgs e)
{
if(((LinkButton)e.CommandSource).CommandName == "DelBtn")
{
...
}
}

这里有两个问题:

其一,好像DataGrid被提交的时候也会调用此OnItemCommand函数,因为当时由于只有一个command,没有用if判断CommandName值的时候,一提交就要出错,而且是在这个函数里面出错的。所以建议就算只有一个command也用if后者select判断一下。

其二,我本来是把<asp:ButtonColumn>定义为“PushButton”的,但是在进行强制类型转换的时候没有找到相应的类型,不管是Button、PushButton都不对,所以只好换用默认的LinkButton才调试通过。

e) DataGrid的分页:

设置DataGrid的

AllowPaging=True
PagerStyle-Mode=NumericPages
PagerStyle-HorizontalAlign=Right
OnPageIndexChanged=”Change_Page_Index”属性

定义下列函数:

void Change_Page_Index(Object sender, DataGridPageChangedEventArgs e)
{
myDataGrid.CurrentPageIndex=e.NewPageIndex;
...
myDataGrid.DataBind();
}
void PagerButtonClick(Object sender, EventArgs e)
{
String arg = ((LinkButton)sender).CommandArgument;
switch(arg)
{
case ("next"):
if (myDataGrid.CurrentPageIndex < (myDataGrid.PageCount - 1))
myDataGrid.CurrentPageIndex ++;
break;
case ("prev"):
if (myDataGrid.CurrentPageIndex > 0)
myDataGrid.CurrentPageIndex --;
break;
case ("last"):
myDataGrid.CurrentPageIndex = (myDataGrid.PageCount - 1);
break;
default:
myDataGrid.CurrentPageIndex = Convert.ToInt32(arg);
break;
}
myDataGrid.DataBind();
}

这里注意的是换了页要重新DataBind()一下。

f) SQL:

不多说了,下面是我觉得常用的函数:

System.Data.DataSet MyQuery(String querystring)
{
String connectionString = @"...";
System.Data.IDbConnection dbConnection = new
System.Data.SqlClient.SqlConnection(connectionString);
System.Data.IDbCommand dbCommand = new
System.Data.SqlClient.SqlCommand();
dbCommand.CommandText = querystring;
dbCommand.Connection = dbConnection;
System.Data.IDbDataAdapter dataAdapter = new
System.Data.SqlClient.SqlDataAdapter();
dataAdapter.SelectCommand = dbCommand;
System.Data.DataSet dataSet = new System.Data.DataSet();
dataAdapter.Fill(dataSet);
return dataSet;
}
int MyDelete(String delString)
{
String connectionString = @"...";
System.Data.IDbConnection dbConnection = new
System.Data.SqlClient.SqlConnection(connectionString);
System.Data.IDbCommand dbCommand = new
System.Data.SqlClient.SqlCommand();
dbCommand.CommandText = delString;
dbCommand.Connection = dbConnection;
int rowsAffected = 0;
dbConnection.Open();
try
{
rowsAffected = dbCommand.ExecuteNonQuery();
}
finally
{
dbConnection.Close();
}
return rowsAffected;
}
int MyInsert(...)
{
String connString = "...";
System.Data.IDbConnection dbConnection = new
System.Data.SqlClient.SqlConnection(connString);
String queryString = "INSERT INTO [...]([...], ...) VALUES (";
queryString +="@..., ...)";
System.Data.IDbCommand dbCommand = new
System.Data.SqlClient.SqlCommand();
dbCommand.CommandText = queryString;
dbCommand.Connection = dbConnection;
System.Data.IDataParameter dbParam_... = new
System.Data.SqlClient.SqlParameter();
dbParam_...ParameterName = "@...";
dbParam_...Value = ...;
dbParam_...DbType = System.Data.DbType.String;
dbCommand.Parameters.Add(dbParam_...);
...
int rowsAffected = 0;
dbConnection.Open();
try {
rowsAffected = dbCommand.ExecuteNonQuery();
}
finally {
dbConnection.Close();
}
return rowsAffected;
}

10、 其他点点滴滴:

a) 去掉图片加链接后外包框:

<img border=0>

b) 去掉IE图片悬停工具栏:

<img galleryimg=”no”>或者<meta http-equiv="imagetoolbar" content="no">

c) 去掉链接点击后的虚线:

<a href="…" onFocus="this.blur()"></a>

d) 使iframe自适应长宽:

<iframe src="..."
onload="this.height =
this.document.body.offsetHeight;this.width=this.document.body.offsetWidth;">
</iframe>

另外千万注意不要漏了</iframe>,网页被撑开了,我查了半天才发现是这个原因。

e) 连续滚动:

一般的marquee会两次滚动间会有一段时间的空白,采用此处的代码可以使得其连续滚动。

上面这些就是这个网站的点点滴滴,没有什么技术含量,只是写篇乱纪,以标明这个颓废的寒假。

Windows Update Services概述—微软系列讲座3

主讲人:王辉
职业:微软认证讲师—苏州索迪高级培训中心
本次讲座不涉及
WUS Chain

防火墙需求
80 443
WUS可使用自定义端口(若80占用,8530,不可配置)

http://www.microsoft.com/windowsserversystem/content/sus/popper.html

SUS
必须先下载全部补丁,才能下载catelog

只有使用SUSLogView等第三方工具检测用户更新

windowsupdate.log,对域的话用MBSA,不够友好

不能对微软应用、驱动程序分发update

在WUS部署中使用计算机分组

Approve时对某组进行应用:
如:测试组;高危组
内置:All Computers Group;Unassigned Computer
实现分组:
Server-Side Client-Side(使用组策略修改)
WUS数据库

WMSDE=MSDE(WINDOWS)只能在server2003上,连接数目,数据库大小没有限制
MSDE(SQL)可以在2000/server2003上,5个连接数目,数据库2G
SQL SERVER 2000(SP3a)

数据库存放的信息:
WUS服务器配置信息
每个更新的metadata(即catalog)
客户端信息及客户端需要哪些更新

更新分为两部分:
1、metadata
2、文件

磁盘空间:最小6G 建议30G

可以从微软的更新站点下载WUS批准的安装,即从WUS下载catalog,而从微软下载文件,以节约外网带宽

Store update file on WUS/Microsoft

带宽优化
* 自动批准检测和自动批准安装
* 可以按更新类型设定是否对某些类别自动批准/安装
* 批准删除

管理员可以先批准检测,用户可以先收到catalog,然后管理员可以根据用户的选择的报表选定某些批准安装

延时下载更新:即只有批准安装的更新才会下载

一般自动批准检测,再手工批准安装

批准状态:

可以根据计算机组更改批准状态

设置最后期限:(DeadLine)

如果用户过了这个时间还没有安装,则强制安装

如果发现office的更新在客户端无法安装,那么先需要在客户端安装windows installer 3.0

Express installation files
比较差异,生成diff文件,然后更新
节约局域网带宽,浪费广域网带宽,从微软网站下载的文件更大

使用BITS(后台只能传输服务)进行所有文件的传输工作
断点续传、带宽控制(如果目前使用60%带宽,则WUS只使用40%带宽)

强大的report功能
report详尽,并且支持filter
客户端更新状态报告

管理与internet断开的网络
导出与导入:建议使用增量备份
1、比对export和import服务器同步高级选项,保证设置一致
2、复制更新:
* 使用ntbackup备份export服务器存放更新的文件夹,默认为WUSWusContent
* 在import服务器使用ntbackup还原备份,还原时选择“Alternate location”路径不变
3、复制metadata
* 从export服务器数据库导出
* wusutil export c:export.cab c:export.log
* 将metadata导入import服务器
* wusutil import c:export.cab c:export.log

数据库一定要独立(不能一个sql支持多个WUS)

硬件考虑
500客户端以下:
CPU 最小 300MHz 推荐 1G
RAM 最小 256MHz 推荐 1G
DB 最小 WMSDE/MSDE 推荐 WMSDE/MSDE

500客户端以上
CPU 最小 1G 推荐 2G
RAM 最小 1G 推荐 1G
DB 最小 SQLSERVER2K 推荐 SQLSERVER2K

磁盘 最少6G 推荐30G

软件:
IIS5.0
BITS2.0
Server2003:.Net Framwork1.1 SP1
2000:IE6.0SP1
.net Framwork1.1 SP1
SQL Server 2000 Desktop Engine(MSDE2000)
WUS自动配置:ASP.Net version 1.1
WMSDE

selfupdate client
2000sp3
xpsp2
server2003

每隔22个小时检测,可通过组策略调整

下载后会再次确认在服务器是否依然有效且被批准

最新的管理模板(%windir%infwuau.adm)可从sp2中获得

即时检测wuauclt.exe /detectnow

客户端cookie过期,其中包含组成员信息(client side)

远程的SQL Server限制:

前端或后端的服务器都不可以为win2000 server
前端或后端的服务器都不可以为域控制器
后端数据库不可以为wmsde或者msde

实现步骤:

在前端服务器安装WUS
wussetup.exe /F
在后端服务器安装WUS
wussetup.exe /B
在后端服务器设置权限
配置前端服务器使用后端

装后端服务器前一定要先把准备工作做好,如sql服务器、sp等等
wussetup.exe /B /V “CONTENT_LOCAL=1″ CONTENT_DIR=”E:WUS”

local_machinesoftwareMicrosoftWindowsUpdateServicesServerSetupSqlServerName

最后启动WUS服务

灵活利用组策略做网络管理—微软系列讲座2

主讲人:孔文达
职业:微软金牌讲师(有这种职业吗?晕~~)
MSN:[email protected]
EMAIL:[email protected]

随堂笔记(较乱,请见谅!)

[组策略功能]
软件安装
开机、登陆、注销、关机脚本
文件重定向
控制IE属性
控制用户操作系统的诸多属性

[组策略组成(嵌入形式)]
GPO(Group Policy Object)
存储于活动目录数据库中的对象
包括以下两部分:
1、GPC(Container):存储于活动目录数据库,保存版本信息,如是否改变等等,占用空间较小;
2、GPT(Template):存储于SYSVOL文件夹(安装活动目录时创建)中,包含调整的所有内容;
SYSVOL目录包含以下最为重要两个文件:
Default Main Policy
Default Domain Control Policy

[组策略应用]
结构:
Site
Domain
OU
OU…
如果设置冲突,则按如下原则解决:
下级优先:OU>Domain>Site

[组策略的存储]
域控制器选项:
PDC模拟器:第一台DC
活动目录管理单元:当前DC
任何可用域控制器:所有当前有效DC

[组策略四大功能]

1、GPMC—编辑组策略的软件,推荐使用
2、软件安装
只是显示在开始程序里面,并提示新安装了程序,但是只有第一次使用才会进行安装
计算机配置:开机时生效
用户配置:登陆时生效
3、设定开机、登陆、注销、关机脚本
4、文件夹重定向
个人文件夹都存在指定位置了,方便管理,用户文件,即使管理员也不能查看
只能指定如下文件:
Application Data
桌面
我的文档
开始菜单
5、控制用户操作系统的诸多属性
举例:
软件限制策略
删除运行…

WMI筛选器
如:判断C:剩余空间
SELECT * FROM win32_logicaldisk WHERE name = “c” and freespace < 100000000(字节)

注意:组策略可自己扩展

[常用工具]
WMI tools:辅助写WMI筛选器
WinInstallLE:制作msi
DCGPOFix(resource-kit):生成刚才提到的误删除的两个极其重要的默认的policy

[常见问题]
设置了 并且注销重新登陆后依然没有生效?
法一、等待2小时
法二、使用命令gpupdate /force强制客户端和DC同步

SMS在企业中的应用—微软系列讲座1

今天在网上逛,突然发现有关于SMS的在线讲座,想到翔帅叫看看关于SMS的咚咚,顺便进去听了听。中国人讲的,不过ppt和操作系统是英文的:(

感觉还不错,不过就是普通话太差。待会儿我会把我的随堂笔记贴在下面,比较乱,希望大家不要介意哈,一个字,一个字打得哦,连复制都不行(视频),我容易吗我?呜呜…

听完后,感觉要想应用sms,现在还不现实,因为现在网管会整个网络系统还没有采用域来管理,所以如果用SMS的话,只有采用最低效的Network模式(详见笔记),意义不大。

算了,不想说了,感冒阿,太惨了!!!贴!!!

===== 华丽的分界线 =====

SMS在企业中的应用

中科院软件研究所 史震

一、体系架构:

* 操作架构

Based on Windows Server 2003:
Like DNS,DHCP,ISA Server(Security),SQL Server(DataBase),SMS Server

* 应用程序架构

Based on Application Center 2000

* 信息流架构

Based on Exchange2003

二、SMS应用范围:

* Asset Management:Hardware
* Software Distribution:Software
* Security Update:Update(Better than SUS:Not only Server SP,Office SP)
* Remote Computer Support:Remote Help
* Mobility Support:移动用户流量本地化

三、Features of SMS:

* Hardware and software inventory:

Hardware software change
Software inventory
Example:
Forbidden QQ,MSN LIKE Program

* Software Distribution:

Noman setup
活动目录中的组策略只能基于域来分发软件,如果只属于某个工作组则无能为力了

* Software metering:

盗版软件
软件使用信息,使用者,启动、停止时间、频率
Example:
某台计算机安装了Office2000但一直没有使用,或使用特别少,再购买时减少购买Office2003数量

* Remote Tools:

减少时间成本

* Software Update Management:

Test
Distribution
Compared to SUS:
Not only Windows Service Pack
But also Office,SQL,Exchange,RRS Service Pack

四、Administrative Support Features:

* Reporting:

IE Explorer report viewer:
1、软件,硬件资产清单;
2、计算机详细配置、状态
3、分发软件、分布时问题,软件使用情况

Feature:
1、可定制
2、可Filter:

如:没有安装xp SP2的计算机

* Status viewing:

某个组件执行特定活动的特征串

* Performance viewing:

Example:大量广播排查

* Backup and recovery tools:

备份恢复SMS站点

* Remote Control

五、Mixed version Hierarchy Considerations:

Certain operating systems and features are no longer supported

SMS 2.0 ok,SMS 2003 no:

* Windows 3.1,3.1.1,95,Before NT 4.0 sp5 pre,ME,XP Home Edition,PE,
* Novel
* Before Sql 7.0 sp2
* SBS(Small Bussiness Server)
* Alpha CPU System

六、Explaining SMS Hierarchies

SMS Site:

* 管理资源
* 三位代码唯一标示
* 主(父子)、辅站点(子)
* 主:数据库支持,存储数据,SQL Server,管理工具
* 父子信任关系
* 有广域网连接时考虑分层结构

七、Key Components:

* Site Server

* Site System Roles:
Client Access Point
Management Point
Reporing Point
Distribution Point
Server Locator Point

* Site Database

* Advanced Client:2000 later

* Legacy Client:windows98,NT 4.0 SP6

* Client — Site System Roles — Site Server — Database

八、Services that Site System Provide:

*  CAP(Client Access Point): For Legacy Client
Legacy Client通过活动目录AB的查询找到SLP(Server Locator Point),然后找到CAP

* Distribute Point:
安装软件时

*  Management Point:For Advanced Client

* Reporing Point:
直接访问数据库

九、The Role of an SMS Client

* 安装SMS Client Agent

* Key Tasks:

* 接受处理SMS数据指令

* 扫描信息,报告SMS站点服务器

* 安装程序和更新

十、What are Collections?

* 对特定资源的划分

* 创建集合(在服务器端):

* Example:
对All Windows XP System Collection分发XP SP2
创建发现模式—创建Collection(通过模式)

十一、Explaning SMS Site-to-Site Communication

* Consideration for creating multiple site:

Network Performance
Number of resources(数据库宿主主机性能)
Features required by users(SMS2003 plus SMS2.0)
International consideration(语言考虑)
Corporate structure
Domain structure(也可考虑修改不合理的域结构)

* How information flows form site to site:

Management Instructions and Data:From parent to Child
Resource Report and Client data:From Child to parent

十二、Explaining SMS Site:

* What are SMS Site Boundaries?
活动目录站点边界(AD Name)
Legacy:必须位于AD内
Advanced:Mobile,可指定

* 资源搜集模式:
Network网络发现:Based on IP Address,多个LAN,多个站点,信息统一于父站点
AD系统发现:从AD数据库中读取
AD User发现
AD System Group发现
Windows User Domain Account发现
Windows Group Domain Account发现
Heartbeat发现:必须维持联系(一般都要启用)

十三、答疑时间:

1、SMS,MOM(Microsoft Operations Manager)差别?
SMS静态、MOM动态

Windows 2000安全清单

1.物理安全
确保每次本机登录服务器后的SignOut过程;设置BIOS密码且修改引导次序禁止从软盘或光盘引导系统;

2.停掉Guest 账号
把guest账号停用掉,最好给guest 账号加一个极其复杂的密码;

3.限制不必要的用户数量
经常检查系统的账号,删除已经不再使用的账号,并注意检查相应账号的权限设置;
应注意检查各个账号的实际权限,而不只是系统用户账号界面或者cmd命令显示出来的权限,严防账号克隆;

4.创建2个管理员所使用的账号
创建一个一般权限账号用来检查日志等一些日常事物,另一个拥有Administrators 权限的账号只在需要的时候使用;届时可让管理员使用 “ RunAS ” 命令来执行一些需要特权才能进行的一些工作,以方便管理;

5.把系统administrator账号改名
把Administrator账号改名,不要使用Admin之类的名字,尽量把它伪装成普通用户,例如:guestone ;

6.创建一个陷阱账号
创建一个名为” Administrator ”的本地账号,把它的权限设置成最低,并且加上一个极其复杂的密码,更进一步的可以在其的login scripts上面做点手脚,达到HoneyPot的效果;

7.把共享文件的权限从“ everyone ”组改成“ 授权用户 ”
任何时候都不要把共享文件的存取权限设置成“ everyone ”组,包括打印共享;
如果没有必要,请关闭默认共享(见附录);
机器重新启动后,这些共享又会重新开启的,如果想要自动关闭,请使用WSH脚本或者BAT脚本;
也可以直接更改注册表,如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters]
"AutoShareServer"=dword:00000000
"AutoSharewks"=dword:00000000

REM 禁止建立空连接(限制对公用的本地安全权限 (LSA) 信息的访问)
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLSA]
"RestrictAnonymous"=dword:1

8.使用安全密码
包括对密码长度和密码复杂度的相应要求;

9.设置屏幕保护密码
不要使用OpenGL和一些复杂的屏幕保护程序,浪费系统资源,黑屏就可以了;

10. 使用NTFS格式分区
把服务器的所有分区都改成NTFS格式;
首先,性能上有较大提升;(簇小于4K条件不同:FAT <256M FAT32 <32G NTFS NIL)
其次,2000以前身份验证协议只有NTLM(NT Lan Manager),NTFS为2000用户提供了更多样的选择—Kerberos v5协议以及附加身份验证工具Crypto API、Secure Sockets Layer(SSL)、公共密钥加密;

NTFS基本安全性数据结构:
(1)SID(安全标识符):唯一的标识用户和组;使用一次,即使删除也不会分发给其他用户;
(2)ACE(访问控制项目):定义了SID怎样才能与安全对象交互,允许或拒绝;可帮忙传递其他参数;
(3)ACL(访问控制列表):数组,包含0-多个ACE;
(4)DACL(自选访问控制列表):权限;
(5)SACL(系统访问控制列表):审核;
(6)SECURITY_DESCRIPTOR(安全描述):如与对象相关的DACL,SACL等等;

多条ACE冲突原则:
(1)组之间的许可可累加;
(2)文件许可优先于目录许可;
(3)拒绝优先于许可;

账户权力:详见本地安全设置->用户权利指派

由于NTFS与FAT相比,支持更多的数据流,所以请注意时常检查数据流信息,防止木马伪装;(可采用stream.exe或者lads.exe工具)

11.运行防毒软件
经常升级病毒库;
微软关于防治病毒的建议请参见:
http://www.microsoft.com/windowsxp/downloads/updates/sp2/antivirus/default.mspx

12.保障备份盘的安全
备份完资料后,把备份盘放在安全的地方;不要把资料备份在同一台服务器上,至少不要备份在同一个驱动器下;
Windows的密码文件(SAM)也有备份,不要忽略备份文件的安全性;

13.利用win2000的安全配置工具来配置策略
请参见控制台(MMC)和组策略(GPEDIT.MSC)的帮助文档

14.关闭不必要的服务
留意服务器上面开启的所有服务,定期检查他们以及他们的默认启动方式;下面是C2级别安装的默认服务,仅供参考:

* Computer Browser service TCP/IP NetBIOS Helper
* Microsoft DNS server Spooler
* NTLM SSP Server
* RPC Locator WINS
* RPC service Workstation
* Netlogon Event log

对于仅运行IIS主机而言,情况如下:
必要服务:
* DNS Client
* Event Log
* License Logging Services
* Windows NTLM Security Support Provider
* Remote Procedure Call(RPC) Services
* Windows NT Server or Windows NT Workstation
* IIS Admin Service
* MSDTC
* World Wide Web Publishing Service
* Protected Storage
* COM+ Event System
* Network Connections
* Windows Management Instrumentation Driver Extensions
* Windows Management Instrumentation

一般需禁用服务:
* Remote Registry Service
* Server
* Schedule
* FTP Publishing Service
* Telnet
* Terminal Service
* Telephony
* Alerter
* ClipBook Server
* Computer Browser
* DHCP Client
* Directory Replicator
* License Logging Service
* Messenger
* Netlogon
* Network DDE
* Network DDE DSDM
* Network Monitor
* Remote Access Server
* Remote Procedure Call(RPC) locator
* Spooler
* TCP/IP Netbios Helper
* Telephone Service

还有一些服务,如:SNMP Service,UPS等,应根据具体情况,如果不能确定可以选择手动,这样系统在需要的时候会自己启动这些服务;

此外,应该时常注意进程列表,特别注意名称与正常进程相近或者有迷惑性名称的进程;

15.关闭不必要的端口
用端口扫描器扫描系统所开放的端口,确定开放了哪些端口;%system%driversetcservices 文件中有知名端口和服务的对照表可供参考;

关闭某端口具体方法为:
网上邻居->属性->本地连接->属性->internet 协议(tcp/ip)->属性->高级->选项->tcp/ip筛选->属性 打开tcp/ip筛选,添加需要的tcp,udp协议即可;

可以利用fport等第三方工具列出端口与进程的对应表,然后直接杀掉进程;对于不能关掉的进程则采用防火墙屏蔽相应端口;

16.打开审核策略
策略 设置
审核系统登陆事件 成功,失败
审核账号管理 成功,失败
审核登陆事件 成功,失败
审核对象访问 成功
审核策略更改 成功,失败
审核特权使用 成功,失败
审核系统事件 成功,失败

17.开启密码密码策略
策略 设置
密码复杂性要求 启用
密码长度最小值 6位
强制密码历史 5 次
强制密码历史 42 天

18.开启账号策略
策略 设置
复位账号锁定计数器 20分钟
账号锁定时间 20分钟
账号锁定阈值 3次

对于IIS主机,请不要开启此策略,否则可能锁定IUSR_HOSTNAME帐号,导致IIS不能访问,目前微软还没有提供解决方案;

注:
关于策略的统一设置,可以使用统一的安全模板。
模板配置下载地址:http://download.microsoft.com/download/win2000srv/SCM/1.0/NT5/EN-US/hisecweb.exe

值得注意的是对于Windows终端服务的审核未包含连接的IP地址的记录,故可采用登录脚本进行记录(例如:netstat –n –p tcp | find “:3389”;记住登录脚本的最后要start Explorer,因为默认的登录脚本就是Explorer)

19.设定安全记录的访问权限
应该设置成只有Administrator和必要的系统账号才有权访问;

20.把敏感文件存放在另外的文件服务器中
考虑是否有必要把一些重要的用户数据(文件,数据表,项目文件等)存放在另外一个安全的服务器中,并且经常备份它们;

21.不让系统显示上次登陆的用户名
具体做法是:
HKLMSoftwareMicrosoftWindows NTCurrentVersionWinlogonDontDisplayLastUserName
把 REG_SZ 的键值改成 1;
或者使用本地安全设置->安全选项;

22.到微软网站下载最新的补丁程序
经常访问微软和一些安全站点,下载最新的service pack和漏洞补丁;
另注:除非确保有安全的SUS Server否则请不要使用Windows Update进行更新,而采用手工方式;
具体网址:http://support.microsoft.com/support/contact/default.asp
最简单的方式是订阅Microsoft 安全通知服务:
http://www.microsoft.com/technet/security/bulletin/notify.mspx

23.关闭 DirectDraw
此为C2级安全标准对视频卡和内存的要求;
具体做法:
HKLMSYSTEMCurrentControlSetControlGraphicsDriversDCI
将Timeout(REG_DWORD)设置为 0 即可;

24.禁止dump file的产生
打开 控制面板>系统属性>高级>启动和故障恢复 把 写入调试信息 改成无;要用的时候,可以再重新打开它;
另外,还需关闭华生医生(DrWaston—drwtsn32)产生的日志文件(故障转储文件);

25.使用文件加密系统EFS
注意要给文件夹也使用EFS, 而不仅仅是针对单个文件; 有关EFS的具体信息可以查看
http://www.microsoft.com/windows2000/techinfo/howitworks/security/encrypt.asp
请一定保管好证书,若遗失,恢复过程会极其繁琐(安装证书颁发机构然后创建附加数据恢复代理),而且还不一定能够修复(例如:WIN2K PRO)

26.关注temp、%windir%repair文件夹
注意随时关注temp文件夹,在进行危险操作后记得删除temp文件夹相应内容;
%windir%repair下面的备份文件存在很大危险;

27.锁住注册表
详细信息请参考:
http://support.microsoft.com/support/kb/articles/Q153/1/83.asp

28.关机时清除掉页面文件
编辑注册表
HKLMSYSTEMCurrentControlSetControlSession ManagerMemory Management
把ClearPageFileAtShutdown的键值设置成1;

29.考虑使用IPSec
有关IPSec的详细信息可以参考:
http://www.microsoft.com/china/technet/security/ipsecloc.asp
IPSec简化版为TCP/IP筛;

30、迁移以下程序
迁移下列程序到一个单独的目录,限定该目录ACL为Admin(完全控制)
xcopy.exe wscript.exe cscript.exe net.exe ipconfig.exe ftp.exe arp.exe edlin.exe rcp.exe ping.exe route.exe at.exe posix.exe rsh.exe cmd.exe qbasic.exe syskey.exe secfixup.exe nslookup.exe runonce.exe tracert.exe nbtstat.exe regedt32.exe regedit.exe finger.exe telnet.exe netstat.exe rexec.exe atsvc.exe cacls.exe edit.com debug.exe command.com cmd.exe

31、关闭子系统
Windows2000内核支持五个子系统:OS/2、POSIX、Win32、MS-DOS VDM、Win16 VDM,大多数用户不需要OS/2和POSIX子系统,删除如下子键:
[HKEY_LOCAL_MACHINESoftwareMicrosoftOS/2 Subsystem for NT]
[HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironmentOs2LibPath]
[HKEY_LOCAL_MACHINESystemCurrentControlSetContrlSession ManagerSubSystemsOptional]
[HKEY_LOCAL_MACHINESystemCurrentControlSetContrlSession ManagerSubSystemsPosix]
[HKEY_LOCAL_MACHINESystemCurrentControlSetContrlSession ManagerSubSystemsOs2]

再删除目录%SystemRoot%System32OS2

32、经常察看日志
* 安全日志文件 %systemroot%system32configSecEvent.EVT
* 系统日志文件 %systemroot%system32configSysEvent.EVT
* 应用程序日志文件 %systemroot%system32configAppEvent.EVT

定位、设置日志文件:
[HKEY_LOCAL_MACHINESystemCurrentControlSetServicesEventlog]
注意修改maxsize子键,如果超出大小,会报错并且不会再记录,默认大小512K。

下面给出脚本设置日志最大25MB,并且允许日志自行覆盖15天前的日志:
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate,(Security)}!” & strComputer & “rootcimv2”) ‘获得VMI对象
Set colLogFiles = objWMIService.ExecQuery(“Select * from Win32_NTEventLogFile”) ‘获得LogFiles
‘-------------------------
For each objLogfile in colLogFiles
strLogFileName = objLogfile.Name
Set wmiSWbemObject = GetObject(“winmgmts:{impersonationLevel=Impersonate}!.rootcimv2:” & “Win32_NTEventlogFile.Name=’” & strLogFileName & “’”)
wmiSWbemObject.MaxFileSize = 2500000000
wmiSWbemObject.OverwriteOutdated = 15 ‘未找到
wmiSWbemObject.Put
Next
‘----------------------------

最简单的察看日志的方式是使用事件察看器;

最后有三点需要注意:
1、安全方面“管理永远大于技术,态度永远大于能力”;
2、安全与易用性永远是一对矛盾,需要在其间权衡利弊;
3、安全界有一个著名的理论,即所谓的“木桶原理”,请杜绝麻痹大意,不拘小节。

对于安全配置的检测,推举使用:
Microsoft 基准安全分析器 (MBSA)
并将 MBSA 添加到每周维护计划中,并按照计划中的任何安全建议操作。

附录:
默认共享目录路径和功能:

[C$ D$ E$]
每个分区的根目录;Win2000 Pro版中,只有Administrator和Backup Operators组成员才可连接,Win2000 Server版本Server Operatros组也可以连接到这些共享目录;

[ADMIN$ %SYSTEMROOT%]
远程管理用的共享目录;它的路径永远都指向Win2000的安装路径,比如 c:winnt;

[FAX$]
在Win2000 Server中,FAX$在fax客户端发传真的时候会到;

[IPC$ 空连接]
IPC$共享提供了登录到系统的能力;

[NetLogon]
这个共享在Windows 2000 服务器的Net Login 服务在处理登陆域请求时用到;

[PRINT$ %SYSTEMROOT%SYSTEM32SPOOLDRIVERS]
用户远程管理打印机;

连比尔盖茨都不知道的Word功能

据说,连比尔盖茨都不知道为什么会这样!

在一个新开的Word文件里面输入:
=rand(200,99)
然后回车看看会发生什么?
机器慢者勿试!

Word的预测:(准确的说是字体的预测)
首先,打开一个Microsoft Word文件;
然后, 输入 Q33NY(必须大写) (注意!这是9.11撞击世界贸易中心的其中一个航班号);
第三,将字体大小改到初号;
最后,将字体转成 Wingdings字体;
你看到了什么?