本文目录一览:
- 1、C++ adsi 操作IIS
- 2、adsi什么意思
- 3、英文缩写 _ ADSI _ ADSI是什么意思
- 4、adsi设置在电脑中的哪里
- 5、如何使用 Visual c + + 中使用 ADSI 来以编程方式使计算机帐户
- 6、谁能解释一下 什么是ADSI 吗?
C++ adsi 操作IIS
如何在 DotNet 中操作 IIS 编程控制IIS实际上很简单,和ASP一样,。Net中需要使用ADSI来操作IIS,但是此时我们不再需要GetObject,因为。Net为我们提供了更加强大功能的新东西。
System.DirectoryServices命名空间中包括了些强大的——DirectoryEntry,DirectoryEntries,它们为我们提供了访问活动目录的强大功能,在这些类允许我们操作IIS、LDAP、NDS以及WinNT.
不过我们此处只谈IIS的控制,一般来说,我们操作IIS一般都是对虚拟目录的操作,因此我将此列为主要的内容来讲。
首先我们要搞清楚IIS的层次结构的问题,下面是我从国外找来的一张图,很好的解释了IIS的层次结构:
[htmChina:Image id=Image1|12][/htmChina:Image]
为了搞清楚IIS的控制语法,我们就必须搞清上图,了解IIS元数据(Metabase)的层次结构。图中的每一个节点称之Key,而每个Key可以包含一个或多个值,这些值就是我们说的属性(properties),IIS元数据中的Key与IIS中的元素是相符的,因此元数据中的属性值的设定是会影响IIS中的设置。这就是我们编程的基本思路和核心。
另外还要了解一下Schema这个概念。它表示IIS中构架的名称,即可以理解IIS元数据中Key的类型,具体点说就是指每个结点的类型。我们知道,IIS中有虚拟目录,普通目录,以及文件这些东东,而这些都属于IIS的元素,区分的他们的标帜就是Schema.比如虚拟目录的Schema就是"IIsVirtualDir",普通目录就是"IIsWebDir".这样我们添加、删除目录时,IIS就知道我们添加的是虚拟目录还是普通目录。
创建虚拟目录
DirectoryEntry是。Net给我们的一大礼物,他的名字我们就知道他的功能——目录入口。使用过ADSI的人都知道操作IIS,WinNT这些时,我们还需要提供他们的Path,操作IIS时,这个Path的格式为:
IIS://ComputerName/Service/Website/Directory
ComputerName:即操作的服务器的名字,可以是名字也可以是IP,经常用的就是localhost
Service:即操作的服务器,IIS中有Web,也有FTP,还有SMTP这些服务,我们主要是操作IIS的Web功能,因此此处就是"W3SVC",如果是FTP则应是"MSFTPSVC"
WebSite:一个IIS服务中可以包括很多的站点,这个就用于设置操作的站点。他的值是一个数字,默认是1,表示缺省站点,如果有其它,则从1开始依次类推。
Directory:不用说,即操作的目录名称,一个站点一般顶层目录为"ROOT",其它目录则是他的孩子(Child)。
首先我们获取一个站点的顶层目录(根目录):
DirectoryEntry rootfolder = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");
如果我们创建这个对象是没有发生异常,则表示这个目录是真实存在的。
下面我们来添加新的虚拟目录,比如我们要加的是"Aspcn":
DirectoryEntry newVirDir = rootfolder.Children.Add("Aspcn","IIsWebVirtualDir");
newVirDir.Invoke("AppCreate",true);
newVirDir.CommitChanges();
rootfolder.CommitChanges();
adsi什么意思
ADSI (Active Directory Services Interface)是一种应用程序数据接口.微软的操作系统支持ADS
I的有Windows NT 4.0 Server, Exchange, IIS, 和Site Server.在WIN2K中ADSI将会成为操作系统
的接口并且可能取代注册表.ADSI的关键并不在于底层的数据存储,而在于它自已的接口层.用一个
接口,只要学习一次,你就可以配置所有的服务器程序.(是不是很爽啊,呵呵!)不像API,你可以使用
所有的语言或环境来通过COM访问ADSI
英文缩写 _ ADSI _ ADSI是什么意思
英文缩写 ADSI
英文全称 Active Directory Service Interfaces
中文解释 活动目录服务接口
缩写分类 电子电工
缩写简介
adsi设置在电脑中的哪里
依次单击开始----设置--控制面板,然后双击网络连接----单击左侧的创建一个新的连接---下一步----连接到internet---手动设置我的连接----用要求用户名和密码的宽带来连接----输入宽带名称-----输入宽带账号和密码---完成
如何使用 Visual c + + 中使用 ADSI 来以编程方式使计算机帐户
本文介绍如何编写 Visual c + + 应用程序,它使用 Active Directory 服务接口 (ADSI) 通过在 LDAP 提供程序在 Windows 2000 域中创建计算机帐户。
步骤和示例代码,可使计算机帐户
将绑定到 LDAP: / / RootDSE。
生成计算机的容器使用 defaultNamingContext RootDSE 对象的属性和在已知的 GUID (WKGUID) 计算机的容器 (aa312825768811d1aded00c04fd8d5cd) 的 ADsPath。
通过请求 IDirectoryObject 接口绑定到计算机的容器。若要获取 IADsContainer 接口使用IDirectoryObject::QueryInterface 方法。
创建一个新的计算机对象,使用 IADsContainer::Create 方法。IADsContainer::Create 方法返回新的计算机对象的一个 IDispatch 指针。 ADsPath 用于创建新的计算机对象,并且必须包含前缀"CN ="在新计算机名。
通过使用 IADsContainer::Create 调用返回 IDispatch::QueryInterface 方法获得新的计算机对象的 IADsUser 接口。IADsUser 接口允许访问特定属性的新的计算机帐户,如 samAccountName、 AccountDisabled 和 IADsSecurityDiscriptor 界面非常容易。
设置计算机名 samAccountName 追加到结尾为"$"。
设置初始密码为新的计算机帐户使用 IADsUser::SetPassword 方法。初始机器帐户密码必须设置为在较低的情况下计算机的名称。
为用户或组有权将计算机添加到域中添加 访问控制项。添加的代码示例将访问控制项权限授予受信者的完全权限。要添加计算机帐户,请使用 ADSI 用户和计算机的管理单元时,要授予最小的权限将计算机加入到域所需的 ACL 添加特定的访问控制项。 请注意,确定在最小访问权限 (访问控制项) 保留为练习的读取器。引用 ADSI 用户和 $ 计算机管理单元文档有关如何查看计算机帐户的扩展的权限的详细信息。
通过将 IADsUser::AccountDisabled 属性设置为零可启用计算机帐户。此步骤是必需的 Windows NT 4.0 的计算机帐户。如果该帐户被禁用的 Windows NT 4.0 计算机,然后计算机将不能加入到域中。这一步是可选的因为运行 Windows 2000 的计算机将尝试登录到网络后启用计算机帐户运行 Windows 2000 的计算机。
谁能解释一下 什么是ADSI 吗?
ADSI (Active Directory Services Interface)是一种应用程序数据接口.微软的操作系统支持ADS
I的有Windows NT 4.0 Server, Exchange, IIS, 和Site Server.在WIN2K中ADSI将会成为操作系统
的接口并且可能取代注册表.ADSI的关键并不在于底层的数据存储,而在于它自已的接口层.用一个
接口,只要学习一次,你就可以配置所有的服务器程序.(是不是很爽啊,呵呵!)不像API,你可以使用
所有的语言或环境来通过COM访问ADSI.(这是后话!)
警告:
在运行本文章的例子之前,请先备份IIS4.0:
打开MMC
(以下略去备份过程)
面向对象的数据库
ADSI对所有的数据都当作对象来看待.用ADSI你可以熟练地操作所有的数据而不用去学一种数据库
查询语言如SQL.相对于一个关系型的数据库,建立一个面向对象的数据库要简单和快速一些.在一个
关系数据库中程序员不得不要知道一个对象是如何破坏和存储的;然而面向对象的数据存储,像ADSI
,不存在这些问题.程序员只要知道你想要访问的那个对象的名字.
为了去对比这两种数据库类型,设想你要一个员工的资料:个人信息,部门信息,和薪水信息.在一个
关系数据库中,这三个数据可能会被分别放在三个表中.而且对数据库的一个更改可能只会影响到其
中的一部分表,对数据库的修改程序员不得不通过一种数据库查询语言如SQL.很少用人去注意对象
是如何被存储的(除了数据库管理员).然而ADSI把所有的信息视为对象,对象之间的联系正是ADSI执
行的一部分,因此,这一部分就不再需要程序员处理了.一旦你学会了处理一种ADSI数据,你就学会了
处理所有的ADSI数据库.作为一个对比,你可能需要学习每一种关系数据库语言如果你要用不同的数
据库的话.(像FOXPRO)
数据结构
数据库结构是一个分级的模型.一个对象节点可以是另一个节点的父节点,兄弟结点,或者一个子节
点.每一个子节点继承父节点的属性.数据库有两个逻辑部分.第一个是定义数据和数据关联的计划.
第二个部分是数据的实际存储.定义一个员工对象是放在计划部分,个人信息放在数据部分.
获得一个对象的实例
不像COM,你不用去使用SERVER.CREATEOBJECT去获得一个ADSI对象的实例.你只需使用GETOBJECT方
法和一个指定服务器和联接位置的参数.例子一有两个GETOBJECT的例子.在第一种情况下,代码建立
了一个WINDOWS NT的ADSI实例.每二个例子取得了一个IIS的ADSI对象.
Example 1
For Windows NT
Set Object = GetObject("WinNT://15seconds" )
For LDAP
Set Object = GetObject("IIS://localhost/w3svc/1")
一些AD服务接口用一种特别的被称为X.500华贵名称的命名规则.IIS并没有用这种规则但是你必须
对X.500这一个命名规则因为你有可能还要操作其它的ADSI数据.你可以
从 得到相关资料.
数据取回
当我们在一个LDAP服务器上寻找信息时,我们必须知道是否信息在实例中或者在规划部分.举一个例
子来说,一个对象名称可以包含在一个对象实例中但是一个对象属性的列表将会存储在一个计划部
分.员工名称,雇佣日期,和部门被存储在员工对象中.计划部分存储了员工属性的定义像数据类型.
例二说明了一个对象实例和对象计划的定义.
Example 2
Employee Instance
Name: Bob Jones
Hire Date: 1/1/98
Department: Information Technology
Employee Object Instance
Attribute "Name", single value, data-type "text", maxlength 50"
Attribute "Hire Date", single value, data-type "date"
Attribute "Department", single value, data-type "text"
对SQL程序员来说,对象定义和一个表的定义是相似的.对象实例就像是一个表中的特定的一行.SQL
和ADSI的区别就在于数据是不是跨越了多个表,程序员是否需要管理数据之间的关系.在ADSI中,接
口是这些关系的负责人.
默认WEB站点的通有属性
第一个例子可以看到IIS4.0的默认WEB站点的属性.在例3中,代码会联接到本地机的默认WEB站点.
Example 3
%
strMachineName = "localhost" 'domain name
strObjectPath = "W3SVC/1" 'object name
'construct object location in IIS
strPath = "IIS://" strMachineName "/" strObjectPath
Set IISObject = GetObject (strPath) 'connect to IIS metabase
%
Name = "%= IISObject.Name %"
Parent= "%= IISObject.Parent %"
SchemaLocation = "%= IISObject.Schema %"
Class = "%= IISObject.Class %"
Guid = "%= IISObject.Guid %"
ADSPath = "%= IISObject.AdsPath %"
输出显示是:
Name = "1"
Parent= "IIS://localhost/W3SVC"
SchemaLocation = "IIS://localhost/schema/IIsWebServer"
Class = "IIsWebServer"
Guid = "{8B645280-7BA4-11CF-B03D-00AA006E0975}"
ADSPath = "IIS://localhost/W3SVC/1"
注意:如果你要在一个ASP页面中运行本程序,请确定登陆的用户被授予了管理员的权限.
在最后一个例子的数据取回可以用于任何一个对象,包括计划对象.每一个对象不管他是一个实在的
对象还是一个计划对象都肯定有这些属性:名称,父,计划定们,CLASS,GUID,和ADS路径.
这些信息包括了通过分级结构访问数据的一些导航信息.NAME属性是一个对象的名称.一个parent属
性告诉了父对象的位置.schemalocation属性指的是计划对象的位置.class属性包括了对象的类型,
它包括了一个对象所有的属性并且被定们到schemalocation这个位置.GUID属性是一个对象的唯一
的识别码.ADSPath是你取回的这个对象的位置.
注:名为1的服务器代表默认的WEB站点
默认WEB站点的属性
既然我们已经知道了对象的位置和对象的类型,那就让我们来看一看默认WEB站点的属性.为了达到
这个目的,我们必须要取得默认WEB站点的计划(schema),找出相关的属性,并且看默认WEB站点的这
些属性的值.
Example 4
%
strMachineName = "localhost"
strObjectPath = "W3SVC/1" 'find first web server listed in w3svc
strPath = "IIS://" strMachineName "/" strObjectPath
Set IISObject = GetObject (strPath)
'find location of web server's definition
Set ClassDefinition = GetObject(IISObject.Schema)
%
table border=1
trthDefault Web Server Property/ththDefault Web Server Value/th/tr
trtdName/tdtd%= IISObject.Name %/td/tr
trtdParent/tdtd%= IISObject.Parent %/td/tr
trtdSchemaLocation/tdtd%= IISObject.Schema %/td/tr
trtdClass/tdtd%= IISObject.Class %/td/tr
trtdGuid/tdtd%= IISObject.Guid %/td/tr
trtdADSPath/tdtd%= IISObject.AdsPath %/td/tr
/table
table border=1
trthClass Property/ththClass Value/th/tr
trtdName/tdtd%= ClassDefinition.Name %/td/tr
trtdParent/tdtd%= ClassDefinition.Parent %/td/tr
trtdSchemaLocation/tdtd%= ClassDefinition.Schema %/td/tr
trtdClass/tdtd%= ClassDefinition.Class %/td/tr
trtdGuid/tdtd%= ClassDefinition.Guid %/td/tr
trtdADSPath/tdtd%= ClassDefinition.AdsPath %/td/tr
/table
%
on error resume next
asMustHaves = ClassDefinition.MandatoryProperties
asMayHaves = ClassDefinition.OptionalProperties
i=1
%
table border=1
trthClass Must Have Property/th
thDefault Web Site Current Value/th/tr
%
For Each Thing in asMustHaves
Response.Write "trtd(" Cstr(i) ") " _
Thing "/tdtd" _
IISObject.Get(Thing) "/td/tr"
i = i + 1
Next
%
/table
table border=1
trthClass May Have Property/th
thDefault Web Site Current Value/th/tr
%
i=1
For Each Thing in asMayHaves
Response.Write "trtd(" CStr(i) ") " _
Thing "/tdtd" _
IISObject.Get(Thing) "/td/tr"
i = i + 1
Next
%
/table
为了取得默认WEB站点的属性,你需要知道属性的名称,或者 isWebServer这一类的属性的列表.在例
4中,我们取得了所有的属性并且列出了他们的值.每个对象都可以有强制的和自已的属性.强制的属
性在每个对象建立时就产生了.
注意:如果IISWEBSERVER只列出了一些可选的属性,在参考IIS文档之前请不要建立一个新的WEB站
点的对象。ADSI对IIS的执行打破了这个规则。有一些必须的属性列在了可选的属性列表中。如果
你在建立一个WEB站点时没有对必要的属性进行设置,你的元数据库可能被破坏。
注意:ADSI不会在错误时停下了,它会继续前进。
建立一个虚拟目录
在例五中我们将在默认的WEB站点下建立一个虚拟目录。我们将先列出一个虚拟目录的所有属性然
后再建立一个虚拟目录。为了列出一个目录的所有属性,我借用了例3的一些代码,只不过将站点
改成了虚拟目录,你必须知道必须的属性:我们要建立怎样的WEB服务器,它的名字,它的物理路
径,一旦你建立了一个虚拟目录后你再将它们的属性一一设置。例五讲了怎样利用这些。
Example 5
%
sComputer ="localhost"
sPhyDir = "c:\adsi"
sVirDir = "ADSITest"
'Get Default Web Site Object
set websvc = GetObject("IIS://" sComputer "/W3svc/1")
'Verify by printing out ServerComment
Response.Write "Comment = " websvc.ServerComment "
"
'Get root of Default Web Site
set vRoot = websvc.GetObject("IIsWebVirtualDir", "Root")
'Get Class Definition of virtual directory
Set ClassDefinition = GetObject(vRoot.Schema)
'Get list of mandatory properties
asMustHaves = ClassDefinition.MandatoryProperties
'Get list of optional properties
asMayHaves = ClassDefinition.OptionalProperties
i=1
%
table border=1
trthClass Must Have Property/th
thRoot Virtual Directory Current Value/th/tr
%
on error resume next
For Each Thing in asMustHaves
Response.Write "trtd(" Cstr(i) ") " _
Thing "/tdtd" vRoot.Get(Thing) _
"/td/tr"
i = i + 1
Next
%
/table
table border=1
trthClass May Have Property/th
thDefault Web Site Current Value/th/tr
%
i=1
For Each Thing in asMayHaves
Response.Write "trtd(" CStr(i) ") " _
Thing "/tdtd" vRoot.Get(Thing) _
"/td/tr"
i = i + 1
Next
on error goto 0
'Create Virtual Directory
'Param 1 is class name
'Param 2 is the new object name
Set vDir = vRoot.Create("IIsWebVirtualDir",sVirDir)
'Only setting two properties
vDir.AccessRead = true
vDir.Path = sPhyDir
'Write information back to Metabase
vDir.SetInfo
%
在这个例子中,为了建立一个对象的实例,父对象被用到了。建立对像的实例用的是对象的class
名称。而这个对象没有强制的属性,一些对象有强制的属性。如果你没有设置这些必要的属性,当
你使用object.setinfo时就会出错。
为了检验这个虚拟目录是否已经建立了,你可以打开IIS看一下。另一个方法是再运行一遍程序,
如果上次已经建立了,你这次就会得到错误结果。(推荐前一种,SUNWEN)
别一个ADSI的特征是在OBJECT。SETINFO被运行之前,所有的属性设置都不会生效。这使你的站点
不会受一些非正规的影响(如果一个人正在请求这个站点的话,就会出现错误)。这比一个关系型
的数据库更加简单。ADSI会自动完成所有相关的数据的设置,你就可以不用使用N次的INSERT语句
(嘻嘻,老外和SUNWEN一样幽默!)。更新也一样。你只需一次则可。
加入一个默认的文档
在这个例子中,我们将把"index.htm"这个文件加入到默认文档的列表中。为了实现这一目标,我
们要从数据源中得到这个虚拟目录,改变与默认文档相关的属性,然后把信息写回去。
Example 6
%
sComputer ="localhost"
sPhyDir = "c:\dina\adsi"
sVirDir = "ADSITest"
'Get Default Web Site Object
set websvc = GetObject("IIS://" sComputer "/W3svc/1")
'Verify by printing out ServerComment
Response.Write "Comment = " websvc.ServerComment "
"
'Get root of Default Web Site
set vRoot = websvc.GetObject("IIsWebVirtualDir", "Root")
'Create Virtual Directory
Set vDir = vRoot.Create("IIsWebVirtualDir",sVirDir)
'Get local copy of object
vDir.GetInfo
Response.Write "Old Default Docs = " vDir.DefaultDoc "BR"
'Only setting two properties
vDir.DefaultDoc = vDir.DefaultDoc ",index.htm"
'Write information back to Metabase
vDir.SetInfo
'Get Object Again
vDir.GetInfo
Response.Write "New Default Docs = " vDir.DefaultDoc
%
在这个例子中,我们是用了objec.getinfo这个语句把信息取回的。它一次性把所有的信息都取回
了。然后我们用setinfo这个语句把信息重新设置了回去。
删除一个虚拟目录
在这个例子中,你将学习到如何删除一个虚拟目录。当建立一个对象时,你必须有它的父对象。这
个真理也同样适用于删除。例七表明了如何做。
Example 7
%
on error resume next
sComputer ="localhost"
sPhyDir = "c:\dina\adsi"
sVirDir = "ADSITest"
'Get Default Web Site Object
set websvc = GetObject("IIS://" sComputer "/W3svc/1")
'Verify by printing out ServerComment
Response.Write "Comment = " websvc.ServerComment "
"
'Get root of Default Web Site
set vRoot = websvc.GetObject("IIsWebVirtualDir", "Root")
'Delete Virtual Directory
Set vDir = vRoot.Delete("IIsWebVirtualDir",sVirDir)
%