<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[每一刻都是崭新的]]></title>
<link>http://blog.pfan.cn/xman</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[Windows下安装OpenSSL及其使用]]></title>
		<link>http://blog.pfan.cn/xman/47886.html</link>
		<description><![CDATA[1. 下载最新版本的Perl，安装后重启系统。
http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.zip
2．下载 latest openssl并解压到C:\openssl-0.9.8k。
http://www.openssl.org/source/
参考openssl目录下的install.win32说明进行安装：
1、进入解压目录。
&gt;cd C:\openssl-0.9.8k
2、运行Configure。
&gt;perl Configure VC-WIN32
如不成功会有明显提示。
3、创建Makefile文件。
&gt;ms\do_ms
推荐使用这种方式，另外两种方式 如果使用也必须保证本机有编译器才能使用。
:ms\do_masm （默认vc 自带的编译器；也也以自己下载安装）
:ms\do_nasm （需要自己下载）
4、配置VC环境变量。
&gt;cd C:\Program Files\Microsoft Visual Studio\VC98\Bin
&nbsp;&nbsp;&gt;vcvars32.bat
5、编译动态链接库。
&gt;cd C:\openssl-0.9.8k
&gt;nmake -f ms\ntdll.mak
如果编译成功，最后的输出都在out32dll目录下：包括可执行文件、两个dll（ssleay32.lib, libeay32.lib）和两个lib文件（ssleay32.dll, libeay32.dll）。
6、为VC添加头文件和静态链接库路径。
ToolsàOptionsàDirectores，在Include files中增加C:\openssl-0.9.8k \inc32目录；在Libray files中增加C:\openssl-0.9.8k\out32dll。
7、编写OpenSSL程序，可参考C:\openssl-0.9.8k\demos
（1）包含相应头文件
#include &lt;openssl/***.h&gt;
(2) 添加静态链接库
#pragma comment(lib, "libeay32.lib"]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-09-19 16:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[按钮添加ToolTip]]></title>
		<link>http://blog.pfan.cn/xman/46896.html</link>
		<description><![CDATA[一．首先创建基于对话框的MFC工程TipBtn，添加成员变量UINT m_nBtnID和CRect m_rcBtn，拖放按钮IDC_BUTTON_ADD到对话框中。本例程动态创建含有提示的按钮。
二． 为对话框添加ToolTip支持，在CTipBtnDlg的头文件中定义CtoolTipCtrl型控件变量
m_tooltip。
// TipBtnDlg.h
class CTipBtnDlg : public Cdialog
{
// ……
// Implementation
public:
&nbsp;&nbsp;&nbsp; UINT m_nBtnID = WM_USER + 101; // 按钮ID
CRect m_rcBtn = CRect(10, 40, 10 + 40, 40 + 30); // 按钮的大小和位置
protected:
&nbsp;&nbsp;&nbsp; CToolTipCtrl m_tooltip;
// ……
}
三．在CTipBtnDlg的OnInitDialog函数中创建ToolTipCtrl并激活。
（1）BOOL CToolTipCtrl::Create( CWnd* pParentWnd, DWORD dwStyle = 0 );
参数： 




pParentWnd 

指定工具提示控件的父窗口，通常是一个CDialog。它不能是NULL。 


dwStyle 

指定工具提示控件的风格，可以是任意Windows风格的组合。
若|TTS_ALWAYSTIP则不管工具栏所属窗口是否被激活，提示都会出现。
（2）void CToolTipCtrl::Activate( BOOL bActivate );
若bActivate=TRUE，即工具提示控件被激活，当光标路过一个向提示控件注册过的工具上时就会显示提示信息；
若bActivate=FALSE，即工具提示控件未被激活，则不会显示工具提示信息，即使是光标路过一个工具上。
// TipBtnDlg.cpp
BOOL CTipBtnDlg::OnInitDialog()
{
// ……
&nbsp;&nbsp;&nbsp; m_tooltip.Create(this); &nbsp;// 创建Tool]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-08-19 21:25:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基于DirectoryServices的IIS虚拟目录管理(5)]]></title>
		<link>http://blog.pfan.cn/xman/45583.html</link>
		<description><![CDATA[三。测试IIS虚拟目录管理服务
// Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
&nbsp;
// 自定义虚拟目录管理服务
using VirtualDirectoryServices;
&nbsp;
public partial class _Default : System.Web.UI.Page 
{
&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Response.Write("测试IIS指向另一台机器的虚拟目录");
&nbsp;&nbsp;&nbsp; }
&nbsp;
&nbsp;&nbsp;&nbsp; protected void Button1_Click1(object sender, EventArgs e)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // （1） 从VirDirTypeList获取虚拟目录类型
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSchemaType = VirDirTypeList.SelectedValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IISVir]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-25 20:04:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基于DirectoryServices的IIS虚拟目录管理(4)]]></title>
		<link>http://blog.pfan.cn/xman/45580.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 删除Web|Ftp虚拟目录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name = "strVirDirName"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 欲删除虚拟目录的名称。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/param&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 无返回值。&lt;br/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 如果欲删除的虚拟目录不存在，则抛出异常。注意在调用处捕获该异常。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/returns&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void DeleteVirDir(string strVirDirName)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Exists(strVirDirName))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-25 17:07:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基于DirectoryServices的IIS虚拟目录管理(3)]]></title>
		<link>http://blog.pfan.cn/xman/45579.html</link>
		<description><![CDATA[二。IIS虚拟目录管理类
&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;
&nbsp;&nbsp;&nbsp; /// IIS虚拟目录管理类
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;
&nbsp;&nbsp;&nbsp; public class IISVirDirManager
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 操作IIS时，Path的格式为IIS://ServerName(IP)/ServiceType/SiteID/Directory
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string KeyType; // 虚拟目录类型,IIsWebVirtualDir或IIsFtpVirtualDir
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;private string SiteID; // 站点标识符
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string RootPath; // IIS Web|Ftp默认站点根目录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private DirectoryEntry RootDE; // IIS Web|Ftp默认站点&nbsp; 
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 连接IIS服务器，获取Web|Ftp默认站点根目录入口
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void ConnectToServer(]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-25 17:03:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基于DirectoryServices的IIS虚拟目录管理(2)]]></title>
		<link>http://blog.pfan.cn/xman/45578.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;value&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// UNC账户名称属性&lt;br/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 当虚拟目录指向另一台计算机上的共享时，必须设置UNC账户。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/value&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string UNCUsername
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return _UNCUsername; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { _UNCUsername = value; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;value&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// UNC账户密码属性&lt;br/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 当虚拟目录指向另一台计算机上的共享时，必须设置UNC账户。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/value&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string UNCPassword
&nbsp;&nbsp;&nbsp;&nb]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-25 17:00:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基于DirectoryServices的IIS虚拟目录管理(1)]]></title>
		<link>http://blog.pfan.cn/xman/45577.html</link>
		<description><![CDATA[一。IIS属性集VirtualDirectory类
using System;
using System.DirectoryServices; // 添加DirectorysServices引用！
&nbsp;
/// &lt;summary&gt;
/// 自定义基于DirectoryServices的IIS虚拟目录管理服务，
/// 支持创建、更新、删除Web和Ftp虚拟目录。
/// &lt;/summary&gt;
namespace VirtualDirectoryServices
{
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;
&nbsp;&nbsp;&nbsp; /// IIS属性类
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;
&nbsp;&nbsp;&nbsp; public class VirtualDirectory
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _Name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _Path;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _AppFriendlyName;
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _UNCUsername;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string _UNCPassword;
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool _AccessRead;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-25 16:57:00</pubDate>
		</item>
				<item>
		<title><![CDATA[DirectoryEntry.Properties遍历IIS属性(2)]]></title>
		<link>http://blog.pfan.cn/xman/45477.html</link>
		<description><![CDATA[三．IIS属性解析
KeyType[0] =IisWebVirtualDir&nbsp; // Schema类名表明操作的目录类型
// 【虚拟目录】
Path[0] =D:\WebSiteTest&nbsp; // 虚拟目录|本地路径
// .NET对应属性如下，其中de为虚拟目录对应的DirectoryEntry对象
de.Properties["Path"][0] = 路径字符串
&nbsp;
AccessFlags[0] =513&nbsp; // 虚拟目录|读取-写入
// 1. 虚拟目录|应用程序设置|执行权限为“无”时
// （1）脚本资源访问
// 不可读取且不可写入为16；可读取不可写入为17；
// 可写入不可读取为18；可读取且可写入为19
// （2）无脚本资源访问
// 不可读取且不可写入为0；可读取不可写入为1；
// 可写入不可读取为2；可读取且可写入为3
// 2. 虚拟目录|应用程序设置|执行权限为“纯脚本”时
// （1）脚本资源访问
// 不可读取且不可写入为528；可读取不可写入为529；
// 可写入不可读取为530；可读取且可写入为531
// （2）无脚本资源访问
// 不可读取且不可写入为512；可读取不可写入为513；
// 可写入不可读取为514；可读取且可写入为515
// 3. 虚拟目录|应用程序设置|执行权限为“脚本和可执行文件”时
// （1）脚本资源访问
// 不可读取且不可写入为532；可读取不可写入为533；
// 可写入不可读取为534；可读取且可写入为535
// （2）无脚本资源访问
// 不可读取且不可写入为516；可读取不可写入为517；
// 可写入不可读取为518；可读取且可写入为519
// .NET对应属性如下，其中de为虚拟目录对应的DirectoryEntry对象
de.Properties["AccessRead"][0] = bool值; // 读取
de.Properties["AccessWrite"][0] = bool值; // 写入
de.Properties["AccessScript"][0] = bool值; // 脚本资源访问
de.Properties["AccessExecute"][0]]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-22 22:38:00</pubDate>
		</item>
				<item>
		<title><![CDATA[DirectoryEntry.Properties遍历IIS属性(1)]]></title>
		<link>http://blog.pfan.cn/xman/45364.html</link>
		<description><![CDATA[一．平台：Windows XP SP3+ IIS 5.1 + Visual Studio 2005
.NET框架下，System.DirectoryServices命名空间中的DirectoryEntry提供了活动目录组件管理功能，它调用ADSI操作IIS。
二．DirectoryEntry.Properties遍历IIS Web虚拟目录和Ftp虚拟目录属性
using System;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
&nbsp;
namespace IISVirDirProperties
{
&nbsp;&nbsp;&nbsp; class Program
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("请输入欲查询的虚拟目录类型：");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("0代表IIS Web虚拟目录");
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Co]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-19 19:59:00</pubDate>
		</item>
				<item>
		<title><![CDATA[同步IWAM和IUSR账户解决HTTP-500错误]]></title>
		<link>http://blog.pfan.cn/xman/45363.html</link>
		<description><![CDATA[装了IIS服务组件后，系统就会生成ISUR和IWAM这两个帐户。
（1）IUSER是Internet 来宾帐户，匿名访问 Internet 信息服务的内置帐户
（2）IWAM是启动 IIS 进程帐户，用于启动进程外应用程序的 Internet 信息服务的内置帐户
IUSR_ComputerName和IWAM_ComputerName帐号保存在三个位置：
1、User Manager for Domains (Windows NT) or Local Users and Groups (Windows XP)，系统的SAM文件中。
2、Microsoft Transaction Server (Windows NT) or Component Services (Windows XP) ，系统的SAM文件中。
3、Internet Information Server (IIS) 的METADATA数据文件中。
如果三个位置的用户名和密码不能同步，就会出现错误，造成asp文件不能访问，出现HTTP错误，例如HTTP-500内部服务器错误。
在 Windows NT 4.0 中尝试获取密码时，密码显示为明文；但在 Windows XP 中，密码显示为星号。若要在 Windows XP中也让密码显示为明文，必须修改 Adsutil.vbs，使它显示明码。为此，打开C:\Inetpub\AdminScripts\adsutil.vbs，找到631行：
631&nbsp;&nbsp;&nbsp; If (IsSecureProperty(ObjectParameter,MachineName) = True) Then
将True修改为False。
命令行修改脚本文件AdminScripts|adsutil.vbs需要调用csript.exe，获取或设置IIS密码的命令是cscript.exe adsutil.vbs get/set xxxxxx
在CMD下运行如下命令
C:\Documents and Settings\Administrator&gt;cd /d c:\Inetpub\Adminscripts
// （1）获取IWAM和IUSR账户密码
// 获取 IWAM 帐户密码
C:\Inetpub\AdminScripts&gt;c]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-19 13:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ADSI简介(2)]]></title>
		<link>http://blog.pfan.cn/xman/45276.html</link>
		<description><![CDATA[三、ADSI编程模型
了解了ADSI的基本结构之后，现在我们再讨论ADSI的编程模型。首先，我们介绍目录对象的路径表示法，通常我们使用URL路径表示法，如下：
&lt;Namespace&gt;:或者 &lt;Namespace&gt;://&lt;Provider-specific stuff&gt;
如果我们不知道名字空间的符号表示，可以从ADSI的最基础的根“ADS:”开始，比如，我们在NT 4.0下对“ADS:”进行枚举可以得到5个提供者名字空间。
当创建目录入口（DirectoryEntry）组件的实例时，需要指定所使用的服务提供程序的类型以及要操作的对象，并与Active Directory连接，这个过程称为“绑定”。这时，你需要指定所使用的协议（LADP、WinNT等），即服务提供程序指示符。当前的一些服务提供程序包括 Internet 信息服务 (IIS)、轻量目录访问协议 (LDAP)和 WinNT等。随后你可能需要指定计算机所在的域名、组名以及计算机名，如果没有显示式指定域名（服务器名），系统就会在整个域中查找与用户绑定过程相关的域控制器，并且使用所找到的第一个域控制器。这样，WinNT下的绑定语法大致为： 
1.WinNT://MyDomain/Group/
2.WinNT://MyDomain/MyComputer/aPrinter/
这个过程中，可能需要指定路径信息，Path属性唯一地标识网络环境中的路径信息，设置该属性将从目录存储区检索新项，它不更改当前绑定的项的路径。同绑定类似，Path 属性的语法取决于服务提供程序。
在WinNT 下连接到计算机上的组语法为：WinNT://domain/computer/group；而IIS下连接到Web目录则为：IIS://LocalHost/W3SVC/1/ROOT/web-directory-name。
LDAP对应的路径如下所示：
LDAP://&lt;Server_Name&gt;/cn=&lt;User_Name&gt;,cn=Recipients,ou=&lt;Site_Name&gt;,o=&lt;Organization_Name&gt;
若要使用 ADSI 技术，在客户端计算机上必须提供有ADSI SDK或ADSI运行库，这可以通过安装 ADSI 2.5 或]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-17 00:03:00</pubDate>
		</item>
				<item>
		<title><![CDATA[ADSI简介(1)]]></title>
		<link>http://blog.pfan.cn/xman/45244.html</link>
		<description><![CDATA[一、ADSI简介
ADSI (Active Directory Services Interface)是Microsoft提供的目录服务接口，它统一了许多底层服务的编程接口，程序员可以使用一致的对象技术来访问这些底层服务。ADSI把这些服务的公共部分提取出来，同时隔离出相异的部分，程序员可以用统一的接口访问底层服务的公共部分，并延伸到底层服务的专有部分。
为了说明ADSI的接口标准和用法，首先我们解释几个重要的概念：
目录(Directory)：目录类似于一个数据库，它通常包含一些描述性的、基于属性的信息。
目录服务（DirectoryService）既是一个信息管理工具，同时也是一个面向最终用户的工具。类似于网络硬件设施的集线器(hub)的概念，目录服务相当于软件集线器。
活动目录(Active Directory)：活动目录是Microsoft在Windows 2000中实现的目录服务，它不仅实现了作为一般目录服务的特性，包括安全特性、分布特性以及复制特性等。它同时也扩充了一些新的特性，以便使得目录信息更加易于管理和搜索。活动目录在实现目录服务的同时，充分考虑了目录信息的可伸缩性，从包含上百个对象的单服务器结构到成千上百服务器的百万以上的对象信息，它都可以正常工作。
目录服务是一个抽象的概念，从用户使用的角度来看，通常最为关心的是目录的名字空间以及相关的访问协议。名字空间限定了目录服务的描述能力，而访问协议必须要标准化，以便支持分布式特性。访问协议的标准为LDAP(Light-weight Directory Access Protocol)协议，它是建立在TCP/IP基础上的目录服务协议，它的信息模型包括了数据和名字空间。与其它Internet协议不同的是，LDAP还提供了一组API以便简化LDAP应用的编写工作。
LDAP也遵守客户-服务器模型，包含目录数据的一个或多个LDAP服务器建立起一个LDAP目录树，LDAP客户通过网络连接到服务器，向服务器发出请求或者执行一些操作。LDAP服务器响应客户的请求，或者把客户的请求指引到其它包含客户指定信息的另外的LDAP服务器上。不管客户连接到哪个LDAP服务器上，他所看到的目录树视图应该是一样的。
Microsoft提供了ADSI用于开发客户方的目录服务应用系统。ADSI是一组COM接口标准，它通过]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-16 01:07:00</pubDate>
		</item>
				<item>
		<title><![CDATA[IIS权限设置]]></title>
		<link>http://blog.pfan.cn/xman/45238.html</link>
		<description><![CDATA[IIS Web 服务器的权限设置有两个地方，一个是 NTFS 文件系统本身的权限设置，另一个是 IIS 下 网站-&gt;默认网站-&gt;右击属性-&gt;虚拟目录 面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。 
　　IIS5.1下 网站-&gt;默认网站-&gt;右击属性-&gt;虚拟目录 面板上有： 
　　脚本资源访问：用户可以对网站目录的脚本文件有操作的权限，前提是开启读取或者写入权限，开启读取权限就有读取脚本文件（源代码）的权限，开启写入权限就有写入脚本文件的权限。
　　读取：用户可以访问网站的文件，建立网站的时候默认开启读取权限。 
写入：用户可以写入文件到网站目录，也就是我们所说的写权限漏洞。
如果开启写入权限不开启脚本资源访问权限，则只有上传普通文件的权限，没有修改为脚本文件后缀的权限。
　　目录浏览：用户可以查看网站目录的所有文件和目录。前提是开启读取权限。
　　记录访问：授予此权限可在日志文件中记录对此文件夹的访问。只有在为网站启用了日志记录时才会记录日志条目。
　　索引资源：授予此权限将允许 Microsoft 索引服务在网站的全文索引中包含该文件夹。授予此项权限后，用户将可以对此资源执行查询。
　　6 个选项。这 6 个选项中，“记录访问”和“索引资源”跟安全性关系不大，一般都设置。但是如果前面四个权限都没有设置的话，这两个权限也没有必要设置。在设置权限时，记住这个规则即可，后面的例子中不再特别说明这两个权限的设置。 
另外在这 6 个选项下面的【虚拟目录】|【应用程序设置】|【执行权限】下拉列表中还有“无”、“纯脚本”和“纯脚本和可执行程序”3 个选项。 
“纯脚本”：单击此设置可在服务器上运行诸如 ASP 程序之类的脚本。
“脚本和可执行文件”：单击此设置可在服务器上同时运行 ASP 程序之类的脚本和可执行程序。
IIS 5.1新建虚拟目录，默认情况下，勾选了读取、记录访问和索引资源，执行权限为“纯脚本”，应用程序保护为“中（共用）”。在文档标签中勾选了“启用默认文档”。目录安全性选项中启用了匿名访问，匿名访问账户为IUSR_，勾选了“允许IIS控制密码”。
　　网站目录如果在 NTFS 分区（推荐用这种）的话，还需要对 NTFS 分区上的这个目录设置相应权限，许多地方都介绍设置]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-16 00:08:00</pubDate>
		</item>
				<item>
		<title><![CDATA[工作组、域和活动目录]]></title>
		<link>http://blog.pfan.cn/xman/45175.html</link>
		<description><![CDATA[工作组模型
工作组（Workgroup）模型是Windows 2000中最基本的概念，它是资源和管理都分布在整个网络上的一种网络模式。这种网络被称为“对等网”，即在工作组模型中，每台计算机的地位都是平等的，每台计算机既可用做服务器，也可用做工作站，每台计算机都有自己的账户和对象。
组（Group）是活动目录或者本地计算机对象，它包含用户、联系人、计算机和其他组，用于分组管理用户和计算机对共享资源的访问。通常可将用户或计算机分为若干个组，授予每个组的权力和权限，也自动授予该组的成员，而不是具体授予每个成员。这样可使管理员将许多用户、计算机当做一个账户来管理。 
域的基本概念
域是一组计算机构成的逻辑组织单元，管理员通过它对网络上的计算机系统进行安全管理。可以通过域把若干计算机组织起来构成一个计算机信息网络系统，域成员中的计算机有域控制器、域成员服务器和域成员计算机3种。没有加入域的计算机也可以像访问工作组一样访问域，但不能获得完全的服务。
一台服务器之所以称为域控制器，是因为在域控制器上存放着包含域的所有信息的域数据库，以数据库为基础对域进行管理的组件称为活动目录，即Active Directory（简称为AD），它是域的安全管理数据库。活动目录是高度伸缩的、分布式的、采用Internet标准技术建立并在操作系统级完全集成的企业级目录服务。它为运行在Windows上的应用程序提供全面的目录服务，同时它还被设计成一个统一的合并点，用于隔离、迁移和集中管理企业拥有的目录并减少目录的数目。这使得活动目录能在任何系统中正常工作，支持从只有几百个对象、一台服务器的小系统到拥有数百万个对象、上千台服务器的庞大系统，使其成为企业信息共享和网络资源通用管理的理想平台。
AD在作为域控制器的服务器上运行。通过AD的操作界面，管理员可以对网络实施有效的组织与管理。
活动目录只能在server版本上才可以安装，因此XP桌面操作系统中没有活动目录。如果需要安装ad用户和计算机,请将windows 2003光盘放入光驱,在光盘中的i386目录找到adminpak.msi管理工具包,用管理员权限安装后本地就会出现ad用户和计算机管理工具。
Active Directory的结构
Active Directory用简单直观的“由下而上”的方法来建置一个大型树形结构。
Activ]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-13 23:24:00</pubDate>
		</item>
				<item>
		<title><![CDATA[IIS一些问题小结]]></title>
		<link>http://blog.pfan.cn/xman/45173.html</link>
		<description><![CDATA[一．安装组件里没有IIS
添加/删除Windows组件里没有Internet信息服务(IIS)组件，按下文方案解决。
&nbsp;&nbsp;&nbsp; 首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”，系统会自动使用记事本打开sysoc.inf这个文件。在sysoc.inf中找到“[Components]”这一段，因为是XP简化版，所以里面东西很少，在里面加上这段：“iis=iis2.dll,OcEntry,iis2.inf,,7”。之后保存并关闭。
　　因为是XP简化版，所以在下载的安装文件里也一定没有IIS的安装文件了，点击这里下载IIS安装文件。下载完后，解压到任意盘符的根目录下（最好是根目录，便于后面打命令）。比如我把压缩包解压到了D盘根目录下。
接下来，在运行中输入“CMD”然后回车，打开命令行模式，在命令行下输入下列的两条命令，在每一行命令结束后回车(假设光驱是D盘)：
EXPand d:\iis51\iis.dl_ c:\Windows\system32\setup\iis2.dll 
EXPand d:\iis51\iis.in_ c:\Windows\inf\iis2.inf 
　　注意如果你解压到了F盘就把上面的D改为F就可以了，其他同理。这时候，你打开控制面板－＞添加/删除Windows组件，就会发现，Internet信息服务（IIS）的安装选项已经出现在安装列表里了。
　　之后的事情，就和平常安装IIS一样了，只不过，在安装的过程中会出现找不到文件的情况（这是正常的，因为你的IIS安装目录没在XP默认的目录下）。这时，你点吉浏览，选择你刚刚解压的目录就可以了，这种让你选择安装文件的现象共会出现3次，每次的目录都按上面说的步骤即可。
　　不出意外，过一会，IIS就安装完成了，点击“完成”。但做到这一步还不算完。需要对IIS进行一些设置:从管理工具里打开“Internet服务管理器”
然后点“默认WEB站点”的右键，转到“目录安全性”选项卡，点“匿名访问和验证控制”的“编辑”按钮，回弹出匿名方法新窗口，再点击其中“匿名访问” 中的“编辑”按钮，将“允许IIS控制密码”全面的勾去掉，然后一路确定返回就可以了。至此XP简化版安装IIS5.1的步骤就全部完成了。
二．IIS无法访问ASP.]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-13 22:11:00</pubDate>
		</item>
				<item>
		<title><![CDATA[自定义应用层通信协议(2)]]></title>
		<link>http://blog.pfan.cn/xman/45132.html</link>
		<description><![CDATA[4.数据包TLV的设计
从应用层HTTP协议，到超文本置标语言HTML（HyperText Mark-up Language），再到可扩展置标语言XML（Extensible Markup Language），它们提供了数据的格式化存储、传输和格式化显示的规范，是网络通信的基石。然而HTTP协议以及HTML/XML置标语言的本质就是定义一堆标签（Tag）对数据进行串行化序列化，然后接收方再根据标签解析、还原数据。
自定义通信协议的关键是对数据包的合理构造（construct）和正确解析（parse），即制定编解码规则。
抽象语法标记ASN（Abstract Syntax Notation） BER的长度确定的编码方式，由3部分组成Identifier octets、Length octets和Contents octets，实际上这就是一中TLV（Type-Length-Value）模型：类型字段（Type或Tag）是关于标签和编码格式的信息；长度字段（Length）定义数值的长度； 内容字段（Value）表示实际的数值。 
因此，一个编码值又称TLV三元组。编码可以是基本型或结构型，如果它表示一个简单类型的、完整的显式值，那么编码就是基本型（primitive）；如果它表示的值具有嵌套结构，那么编码就是结构型 （constructed）。 
TLV编码就是指对Type（Tag）、Length和Value进行编码，形成比特流数据包；解码是编码的逆过程，是从比特流缓冲区中解析还原出原始数据。
采用C++编程语言设计TLV协议类，其类视图如图5所示。

图5 CTLV类视图
目前只提供设置整形值（int型）的setValue_Int和设置字符串值（C_String型）的SetValue_Cstring两个接口。
TLV将数据封装成包的格式如表1所示。
表1 TLV包格式





TLV包


头部

包实体


m_dwTag

m_nLen

m_pValue




TLV的接口说明：
（1）值类型标签m_vtTag是内部辅助枚举变量，它根据构造TLV时传递的服务类型标签m_dwTag来确定。
（2）TLV::m_nLen在为TLV设置具体值时确定。
（3）TLV包的封装：
1）使用Tag]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-11 22:33:00</pubDate>
		</item>
				<item>
		<title><![CDATA[自定义应用层通信协议(1)]]></title>
		<link>http://blog.pfan.cn/xman/45131.html</link>
		<description><![CDATA[1．通信协议的概念及其要素
在OSI开放互联参考模型中，对等实体之间数据单元在发送方逐层封装，在接收方的逐层解析。发送方N层实体从N+1层实体得到的数据包称为服务数据单元（Service Data Unit，SDU）。N层实体只将其视为需要本实体提供服务的数据，将服务数据单元进行封装，使其成为一个对方能够理解的数据单元（Protocol Data Unit，PDU），封装过程实际上是为SDU增加对等实体间约定的控制信息（Protocol Control Information，PCI）的过程。 
为了保证网络的各个功能的相对独立性，以及便于实现和维护，通常将协议划分为多个子协议，并且让这些协议保持一种层次结构，子协议的集合通常称为协议簇。
网络协议的分层有利于将复杂的问题分解成多个简单的问题，从而分而治之。各层的协议由各层的实体实现，通信双方对等层中完成相同协议功能的实体称为对等实体。对等实体按协议进行通信，所以协议反映的是对等层的对等实体之间的一种横向关系，严格地说，协议是对等实体共同遵守的规则和约定的集合。
通信协议精确地定义了双方通信控制信息和解释信息：发送方能将特定信息（文本、图片、音频、视频）按协议封装成指定格式的数据包，最终以串行化比特流在网络上传输；接收方接收到数据包后，根据协议将比特流解析为本地化数据，从而获取对方发送过来的原始信息。
通信协议包括三个要素：
（1）语法：规定了信息的结构和格式；
（2）语义：表明信息要表达的内容；
（3）同步：规则涉及双方的交互关系和事件顺序。
整个计算机网络的实现体现为协议的实现，TCP/IP协议是Internet互联网的核心协议。
2．通信协议开发步骤
（1） 协议的开发主要包括协议设计、协议形式描述、协议实现和协议一致性测试。协议的开发过程与步骤如图1所示。

&nbsp;&nbsp;&nbsp; 图1 协议开发过程与步骤
（2） 协议设计过程中的分组发送接收模型如图2所示。

图2协议设计过程中的分组发送接收模型 
（3）协议的一致性测试
协议的一致性测试是指测试协议能否按照预想的控制策略实现正确的通信，主要体现在数据包通过信道从信源传送到信宿后，信宿能够根据协议正确的解析出原始信息。
协议的一致性测试如图3所示。

图3 协议一致性测试环境
根据测试环境的可以分为]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-11 22:15:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Winsock五种I/O模型的性能分析]]></title>
		<link>http://blog.pfan.cn/xman/45130.html</link>
		<description><![CDATA[五种I/O模型的性能分析
重叠I/O模型的另外几个优点在于，微软针对重叠I/O模型提供了一些特有的扩展函数。当使用重叠I/O模型时，可以选择使用不同的完成通知方式。
采用事件对象通知的重叠I/O模型是不可伸缩的，因为针对发出WSAWaitForMultipleEvents调用的每个线程，该I/O模型一次最多都只能支持6 4个套接字。假如想让这个模型同时管理不止64个套接字，必须创建额外的工作者线程，以便等待更多的事件对象。因为操作系统同时能够处理的事件对象是有限的，所以基于事件对象的I/O模型不具备伸缩性。
使用完成例程通知的重叠I/O模型，因为以下几个原因，也不是开发高性能服务器的最佳选择。首先，许多扩展功能不允许使用APC（Asyncroneus Procedure Call，异步过程调用）完成通知。其次，由于APC在系统内部特有的处理机制，应用程序线程可能无限等待而得不到完成通知。当一个线程处于“可警告状态”时，所有挂起的APC按照先进先出的顺序（FIFO）接受处理。现在考虑这样一种情况，服务器已经建立起了一个连接，并且调用含有完成例程指针的WSARecv投递了一个重叠I/O请求。当有数据到达时（即I/O完成时），完成例程执行并且再次调用WSARecv抛出另外一个重叠I/O请求。一个APC抛出的I/O操作需要一定的时间才能完成，所以这期间可能另外一个完成例程等待执行（比如本次WSARecv还没接收完时，又有一个新的客户接入并发来数据），因为还有更多的数据需要读取（上一个客户发来的数据尚未读完）。只要（投递WSARecv的）那个套接字上还有“未决”（未接收完）的数据，就会导致调用线程长久阻塞。
基于完成端口通知的重叠I/O模型是Windows NT系统提供的一个真正支持高伸缩性的I/O模型。在上一章中，探讨了Winsock几种常见的I/O模型，并且说明了当应对大规模客户连接时，完成端口是最佳的选择，因为它提供了最好的伸缩性。
对不同Winsock I/O模型的性能测试结果如图1所示。其中服务器采用Pentium 4 1.7 GHz Xeon的CPU，768M内存；客户端有3台PC，配置分别是Pentium 2 233MHz ，128 MB 内存，Pentium 2 350 MHz ，128 MB内存，Itanium 733 MHz ，1 GB内存。服务]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-11 21:45:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Winsock服务器设计的四个关键问题]]></title>
		<link>http://blog.pfan.cn/xman/45129.html</link>
		<description><![CDATA[6.2.1 接受连接的方法
Winsock扩展函数AcceptEx是唯一能够使用重叠I/O接受客户连接的函数。下面主要深入探讨使用该函数接收连接的问题。
前面已经讨论过，当客户连接进来时，服务器需要创建一个套接字来负责维护与一个客户端的会话。使用AcceptEx函数之前必须创建一些套接字，并且这些套接字必须是未绑定、未连接的，即使它们可能在调用TransmitFile, TransmitPackets, 或DisconnectEx后可以重用。
响应服务器必须总是具有足够的AcceptEx在站岗，以便在有客户连接请求时调用。但是，并没有具体的数量能够保证服务器能够立即响应连接。我们知道在调用listen将监听套接字置于监听状态后，TCP/IP堆栈会自动接受到来的连接，直到达到listen的backlog参数设定的限制。对于Windows NT服务器而言，支持的backlog的最大值为200。如果服务器投递了15个AcceptEx调用，然后突然有50个客户请求连接服务器，它们的连接请求都不会遭到拒绝。服务器投递的AcceptEx I/O会满足前面的15个连接，剩下的35个连接都被系统默认连接了。检查一下backlog的值发现，系统还有能力默认接受165个连接。之后，如果服务器投递AcceptEx调用，它们会立即成功返回，因为系统会将默认接收的连接放入“等待连接队列”中。
服务器的特性是决定要投递多少个AcceptEx操作的重要因素。例如，希望处理大量短时间即时连接的客户要比处理少量长时间连接的客户投递更多的AcceptEx I/O。一个好的策略是允许AcceptEx的调用数量在最小值和最大值之间变化。具体做法是，应用程序跟踪未决的AcceptEx I/O的数量，当一个或多个I/O完成使这个未决I/O数量变得比最小值还小时，就再投递额外的AcceptEx I/O。
在Windows 2000和以后的Windows操作系统版本中，Winsock提供了一种机制，用来确定应用程序是否投递了足够的AcceptEx调用。创建监听套接字时，使用WSAEventSelect函数为监听套接字关联一个事件对象，注册FD_ACCEPT事件。如果投递的AcceptEx操作用完，但是仍有客户请求接入（系统根据backlog值决定是否接受这些连接），事件对象就是受信，说明应该投递额外的A]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-07-11 20:07:00</pubDate>
		</item>
				<item>
		<title><![CDATA[TCP三次握手/四次挥手]]></title>
		<link>http://blog.pfan.cn/xman/44384.html</link>
		<description><![CDATA[在TCP/IP协议中，TCP协议提供可靠的连接服务，采用三次握手建立一个连接，如图1所示。 
（1）第一次握手：建立连接时，客户端A发送SYN包（SYN=j）到服务器B，并进入SYN_SEND状态，等待服务器B确认。
（2）第二次握手：服务器B收到SYN包，必须确认客户A的SYN（ACK=j+1），同时自己也发送一个SYN包（SYN=k），即SYN+ACK包，此时服务器B进入SYN_RECV状态。
（3）第三次握手：客户端A收到服务器B的SYN＋ACK包，向服务器B发送确认包ACK（ACK=k+1），此包发送完毕，客户端A和服务器B进入ESTABLISHED状态，完成三次握手。
完成三次握手，客户端与服务器开始传送数据。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图1 TCP三次握手建立连接
由于TCP连接是全双工的，因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动，一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭，而另一方执行被动关闭。
（1）客户端A发送一个FIN，用来关闭客户A到服务器B的数据传送（报文段4）。
（2）服务器B收到这个FIN，它发回一个ACK，确认序号为收到的序号加1（报文段5）。和SYN一样，一个FIN将占用一个序号。
（3）服务器B关闭与客户端A的连接，发送一个FIN给客户端A（报文段6）。
（4）客户端A发回ACK报文确认，并将确认序号设置为收到序号加1（报文段7）。
TCP采用四次挥手关闭连接如图2所示。

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp]]></description>
		<author><![CDATA[phunxm]]></author>
		<pubDate>2009-06-15 18:50:00</pubDate>
		</item>
		</channel>
</rss>