請按一下此處安裝 Silverlight*
Taiwan變更|所有的 Microsoft 網站
Microsoft
|教學短片|技術中心|最新活動時程|網路廣播教學|TechNet 論壇|訂閱電子報|訂閱 TechNet Plus|好書推薦|技術支援服務
伺服器作業系統
個人電腦作業系統
伺服器產品與技術
個人電腦產品與技術
資訊安全產品與技術
System Center 產品
Office System 產品
IT 人員常用資源
嵌入式作業系統
TechNet 在地資源
Technet 首頁 > 產品與技術 > Server Operating Systems > Windows 2000 Server
MS Active Directory 服務介面 (ADSI)

 

管理和使用目錄服務的開放式介面

白皮書

摘要

本文提綱摯要的介紹 Microsoft 如何透過適當定義的開放式介面整合多個目錄服務的計畫:Microsoft®Active directory 服務介面 Windows® 上標準開放式目錄服務管理和程式設計模式的出現,將使目錄服務廣泛地被應用到商業和自行開發的應用程式中。

介紹

在大型的分散式電腦環境中工作所面臨的挑戰之一是如何識別和尋找資源,例如使用者、群組、列印佇列和文件。目錄服務是分散式電腦環境的一部分,它提供了尋找和識別系統中使用者和可用資源的方法。目錄服務就像電話號碼簿。指定人或資源的名稱,它就能提供存取此人或資源所需的資訊。您不需要使用特殊的連結資訊來存取網路上的資源。

許多企業已經存在許多不同的目錄。例如,網路作業系統、電子郵件系統和群體軟體產品都有其自己的目錄。單一企業部署多種目錄時會產生許多問題。這些問題包括可用性、資料一致性、開發成本、支援成本等等。

Active Directory 服務介面透過提供單一、一致的開放式介面來管理和使用多個目錄以解決這些問題。

本文件假設讀者對 OLE、元件物件模式和目錄服務有一定了解。範例程式出現在 Microsoft Visual Basic® 開發系統。

目錄服務現況

在一個公司中存在多種不同目錄 (許多負有管理職責) 的現象並不少見。這些目錄包括網路資源目錄,如 LDAP 下的目錄、Active Directory、Banyan StreetTalk、Microsoft Windows® 作業系統目錄服務和 Novell 目錄服務,以及應用程式特有的目錄,如 Lotus Notes、cc:Mail 或 Microsoft Mail。雖然對整個組織而言,只有一個目錄最好,但至今沒有一個產品能夠完全滿足如此複雜的要求。

圖 1 目錄的挑戰

組織內存在著多種目錄為使用者、管理員和程式開發人員帶來了複雜的挑戰。這些問題限制了廣泛的目錄部署。為了取得跨多目錄的資訊,一般使用者要面對多個登入和多種介面。管理員面對的是管理多目錄的複雜工作。一般使用者和管理員希望應用程式開發人員使用現有的管理目錄,但程式開發人員面臨困難的抉擇-應當使用哪種目錄?每種目錄都提供獨特的應用程式介面。程式開發人員必須選擇特定的目錄建置或者支援其應用程式的多種版本。結果是,程式開發人員極少使用現有的目錄服務。

Microsoft 有一個能夠幫助解決這些客戶問題的策略:Active Directory 服務介面 (ADSI)。ADSI 是一組 COM 程式設計介面,它可以讓客戶和獨立軟體廠商 (ISV) 藉由一組適當定義的介面,輕鬆的建立應用程式來登入、存取和管理多種目錄服務。

最廣為人知的開放式程式設計 API 之一是開放式資料庫連接 (ODBC)。ODBC 提供關聯式資料庫的開放式介面,因此能讓程式開發人員撰寫的應用程式和工具與與支援 ODBC 的任何資料庫一起使用。由於 ODBC 開發團體越來越多,主要的關聯式資料庫現在都支援 ODBC。ADSI 在目錄服務方面相當於 ODBC。

ADSI 透過開放式介面,讓程式開發人員可以存取多種目錄服務驅動程式。以 ADSI 撰寫的應用程式可以與任何提供 ADSI 驅動程式的目錄一起使用。ADSI 解決了上面列出的問題。

圖 2 開放式的解決方案

本文說明 ADSI 的概念、功能、優點和結構並提供 ADSI 使用的範例。

Active directory 服務介面

ADSI 從不同的網路中摘出目錄服務的功能,提成一組目錄服務介面,以便用於網路資源管理。標準的 ADSI 物件是存在於多種名稱空間的物件。ADSI 的典型名稱空間是不同網路作業系統的目錄服務。管理員和程式開發人員可以使用 ADSI 服務來列舉和管理目錄服務中的資源,而無論哪一個網路環境包含此資源。

ADSI 可以讓您更容易執行日常管理工作,如增加新使用者、管理印表機和在分散式電腦環境中尋找資源。

ADSI 讓程式開發人員更容易啟動其應用程式與中心目錄的連線。管理員與程式開發人員僅需處理單一的目錄服務介面,而不需顧及已經安裝的目錄服務。

ADSI 是 Windows® 開放式服務結構 (WOSA) 開放式目錄服務介面 (ODSI) 的一個元件。

網路管理員 將使用 ADSI 來自動完成日常管理工作,如增加使用者和群組、管理印表機和設定網路資源的權限。

獨立軟體廠商 (ISV) 和和一般使用者程式開發人員可使用 ADSI 來啟動其產品和應用程式與中心目錄的連線。服務可以在目錄中自行發行,客戶可以使用目錄來尋找服務,且兩者都可以使用目錄來尋找和操作其他物件。由於 ADSI 獨立於基礎目錄服務,啟動目錄的產品和應用程式可以在多種網路和目錄環境中成功地操作。
功能
優點
開放式

任何目錄驅動程式都可以裝置 ADSI 驅動程式;使用者可以自由選擇目錄服務而不需犧牲管理能力。

與 DS 無關

管理應用程式並不會緊密地與某個供應商的目錄服務綁在一起。所以相同的應用程式能夠在多種目錄上使用,以減少開發時間和支援成本。

支援 Java

ADSI 物件透過 Java COM 可以容易地存取 Java applets 和程式的目錄服務。

安全性

ADSI 同時支援身份驗證和授權程式設計模式。

簡單的程式設計模式

不須瞭解廠商的特定目錄 API 就可以開發管理和其他啟動目錄的應用程式。

OLE Automation Server

所有的 OLE Automation Controller (如 Visual Basic、Perl、Rexx、C/C++ 等等) 都可以用來開發目錄服務應用程式。管理員和程式開發人員可以使用他們所熟悉的工具,提高生產力-減少開發時間和支援成本。

功能豐富

ISV 和進階一般使用者可以使用與簡單指令管理應用程式相同的 ADSI 模式來開發複雜的應用程式。

可擴充性

Directory 提供者、ISV 和一般使用者可以使用新的物件和功能擴充 ADSI,以增加其價值並滿足特殊需要。

ADSI 結構

ADSI 物件模式包含 ADSI 物件和依存物件。用戶端可使用介面來操作物件。而ADSI 驅動程式則可建置 ADSI 物件及其介面。

Active Directory 服務介面物件是 COM 物件,此物件代表基礎目錄服務中的持續性物件。Active Directory 服務介面物件使用一個或多個 COM 介面來操作。

ADSI 物件分為兩群組:目錄服務分葉物件和目錄服務容器物件。容器物件能夠包含其他的 ADSI 物件。而分葉物件不能包含 ADSI 物件。

將物件類型分割為一個主物件和一個或多個依存物件完成了屬性和方法的邏輯分組。這種分割無需反映基礎目錄的結構。主物件和依存物件的關係不應與容器和內容的關係相混淆-前者是 ADSI 的特性而後者是基礎目錄的特性。

ADSI 驅動程式包含建置特定名稱空間的 ADSI 物件和依存物件。下面的圖 3 顯示用戶端只與如何與獲得和使用物件上的介面有關,與如何及在何處裝置物件軟體的細節無關。

圖 3 驅動程式的結構

ADSI 提供預先定義的物件,這樣可以保持目錄服務操作在名稱空間之間的一致性。但是,任何目錄中的 ADSI 物件所具有的功能可能比 ADSI 所定義的要多。目錄可能還包含一些 ADSL 根本沒有定義的物件。另外,也有些可擴充的目錄服務,能讓管理員和獨立軟廠商修改其基本架構和任意擴充其物件。

由架構管理 ADSI 物件來處理物件的擴充。這些物件用於:

  • 瀏覽物件的定義。
  • 擴充物件的定義。

ADSI 物件的架構管理

架構管理物件可以用來瀏覽和修改名稱空間的架構。這些物件是:

  • 包含指定架構的架構容器物件。
  • 定義物件類別的類別容器物件。
  • 描述屬性的屬性物件。
  • 描述可用於屬性定義的語法的語法物件。

這些物件不同於目錄服務物件如使用者元件,因為它們的屬性不再細分為功能集。

架構容器物件

架構容器物件用於將一組物件定義附加到目錄樹狀目錄的一部分。典型情況下,目錄的每一例項都有其自己的架構。ADSI 透過放置架構容器作為目錄根的子目錄來表示。

w2kads04

圖 4 架構容器

圖 4 顯示典型的配置。但是,ADSI 沒有將架構容器限制在目錄樹狀目錄的這個層級。複雜的目錄可能允許在目錄例項中存在多個架構。這種情況下,可能會在樹狀目錄的其他部分發現架構容器。如同圖 5 中所示,在任何指定的 ADSI 容器中可能只有一個架構容器。

w2kads05

圖 5 架構階層

架構容器本身是包含類別、功能集、屬性和語法定義的樹狀目錄。您可以在容器中建立新的類別和功能集來擴充架構。

功能集與類別分開定義,這樣就可以在多個類別定義中使用。

類別容器物件

類別容器物件用於定義可以在目錄中建立的物件類別。新的類別可以使用 ADSl 模式從現有類別導出。

圖 6 建立類別

圖 6 說明類別容器物件如何與其他類別物件、屬性物件和語法物件關聯來建立類別的定義。類別物件指向屬性物件,而屬性物件指向此屬性支援的語法。

所有 ADSI 物件都提供兩種方法-GetInfo 和SetInfo 來提供屬性簡單的快取記憶處理。與取得和設定屬性有關的操作發生在此快取記憶體中。

呼叫者取得物件後可以在任何時候從 ADSI 物件取得屬性的值。呼叫者無需先呼叫 GetInfo。如果此屬性從未被擷取過,驅動程式負責擷取和快取記憶處理此屬性以滿足要求。下一次要求會由快取記憶體值提供。

呼叫 GetInfo 從基礎目錄明確地重新整理物件的快取記憶體屬性。透過呼叫 GetInfo,呼叫者可確保屬性值是呼叫 GetInfo 時的目前值。如果 GetInfo 方法執行時已經變更本機物件的快取記憶體,但尚未執行 SetInfo 方法,此更改會被放棄。GetInfo 能讓用戶端提供所使用的屬性的提示,這樣驅動程式就可以最佳化網路存取。

呼叫 SetInfo 將物件寫回基礎目錄。在呼叫 SetInfo 方法之前不會變更目錄內的物件屬性。

存在於指定名稱空間中的物件使用唯一的名稱來識別。例如,儲存在電腦磁碟機上的檔案存在於檔案系統名稱空間。檔案的唯一名稱是根據其儲存在檔案系統名稱空間中的位置,如:

C:\Public\Documents\Adsi\Adsi_spec_v3.doc

目錄服務名稱空間也透過唯一的名稱識別所包含的物件,而名稱通常是根據目錄中可以發現此物件的位置。例如,在 Active Directory 中,指定物件可能有這樣的名稱:

CN=JSmith, OU=Sales, DC=ArcadiaBay, DC=Com

不同目錄服務使用不同的格式來命名所包含的物件。這使得處理不同名稱空間具有挑戰性,尤其對是開發人員而言,必須考慮到程式碼可能執行的不同環境。

ADSI 的目的就是將程式碼對物件路徑的知識最小化,這樣程式就可以在名稱空間之間移動。

ADSI 定義了一種命名法則,可以在不同環境中識別出 ADSI 物件。這些名稱叫做 AdsPath 字串。AdsPath 包含驅動程式的 moniker (如 LDAP: 或 WinNT:) 和驅動程式的特定路徑。

ADsPath 字串的範例:

WinNT://REDMOND/jsmith,使用者看到前面的註釋 re:「WinNT」
識別 jsmith 為 Redmond 網域內的使用者

WinNT://REDMOND/comp1, computer
識別 Redmond 網域內的 comp1

WinNT://REDMOND/comp1/alice
識別 alice 為 comp1 電腦上的本機使用者。

LDAP://OU=Sales, DC=ArcadiaBay, DC=COM
識別 Arcadia 網域內的組織單位

LDAP://exch01/O=Microsoft
識別 Exchange Server 上的 Exchange 物件

ADSI 透過 IADsContainer 介面提供簡單的瀏覽模式。另外,呼叫者可以使用此介面來篩選物件類型。

範例:顯示指定組織單位內的所有物件

Set ou = GetObject("LDAP://host1/OU=Sales, DC=ArcadiayBay,DC=COM")
For each obj in ou
Debug.Print obj.Name
Next

範例-列出 ArcadiaBay 網域內的所有使用者:

Set dom = GetObject("WinNT://ArcadiaBay")
dom.Filter = Array("user")
For each usr in dom
Debug.Print usr.Name
Next

搜尋是在許多目錄中最常使用的工作之一。在 ADSI 中您可以使用 OLE 分散式查詢 (DB) 介面,或是使用 Active Directory 服務介面直接搜尋。為了控制搜尋結果,這些介面能讓呼叫者指定搜尋頁的大小、排序、大小限制、搜尋層級、搜尋範圍和其它選項。

由於 ADSI 也是 OLE DB 驅動程式,使用 Microsoft SQL Server™ 隨附的分散式查詢技術可以將 ADSI 結果集和另一個 OLE DB 驅動程式的結果集結合起來。例如,您可以將 SQL Server 中的銷售資料與 Active Directory 中找到的使用者和連絡人資訊結合起來。

範例:使用 ADO 查詢 Active Directory

Dim con As New Connection, rs As New Recordset
Dim Com As New Command


'Open a Connection object
con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider"


'Create a command object on this connection
Set Com.ActiveConnection = con


Com.CommandText = "select name from 'LDAP://DC=ArcadiayBay,DC=COM' where objectClass='*' ORDER BY NAME"

'-----------------------------------------
'Set the preferences for Search
'--------------------------------------
Com.Properties("Page Size") = 1000
Com.Properties("Timeout") = 30 'seconds
Com.Properties("searchscope") = ADS_SCOPE_SUBTREE
'--------------------------------------------
'Execute the query
'--------------------------------------------
Set rs = Com.Execute


'--------------------------------------
' Navigate the record set
'----------------------------------------
While Not rs.EOF
Debug.Print rs.Fields("Name").Value
rs.MoveNext
Wend

ADSI 提供身份驗證和授權用戶端存取。如果使用 ADSI 與 Active Directory 通訊,可以根據環境不同使用 Kerberos 或 NTLM 來驗證使用者身份。ADSI 也可以讓您操作安全描述元。

範例:以 JSmith 登入

Dim dso As IADsOpenDSObject
Dim domain As IADsDomain
Set dso = GetObject("WinNT:")
Set domain = dso.OpenDSObject("WinNT://ArcadiaBay", "JSmith", "secret", ADS_SECURE_AUTHENTICATION)

範例:新增物件的 ACE 權限

Dim Ace1 as new IADsAccessControlEntry
Dim Ace2 As new IADsAccessControlEntry
Dim Dacl as new IADsAccessControlList
' Add the ACEs to the Disretionary ACL
Dacl.AclRevision = 4 'DS ACL Revision
' Set up the first ACE
Ace1.AccessMask = -1 'Full Permission (Allowed)
Ace1.AceType = ADS_ACETYPE_ACCESS_ALLOWED
Ace1.AceFlags = ADS_ACEFLAG_INHERIT_ACE
Ace1.Trustee = "ACTIVED\Administrator"
' Add the ACEs to the Disretionary ACL
Dacl.AddAce Ace1
Dacl.AddAce Ace2

ISV 或企業程式開發人員可以透過新增介面至現有 ADSI 介面來擴充物件語義。ADSI 結合 COM 彙總模式和目錄技術,提供強有力的擴充模式。例如,備份和還原廠商可以使用廠商特殊的方法或屬性來擴充電腦物件。使用這些方法,管理員可以撰寫將所有電腦備份到指定的組織位置的指令檔。

範例:備份銷售組織單位的所有電腦

Set ou = GetObject("LDAP://OU=Sales, DC=ArcadiaBay, DC=COM")
Ou.Filter = Array("computer")
For each comp in ou
comp.BackUpNow() ' this is extension method
Next

ADSI 標準物件

ADSI 定義兩種物件。用戶端使用「架構管理物件」來瀏覽和擴充架構。「目錄物件」代表由 ADSI 驅動程式管理的基礎名稱空間內的物件。在 <架構管理> 一節中已經討論了「架構管理物件」。

ADSI 定義一組標準容器和分葉物件,它們代表網路目錄中最常見的物件。使用架構擴充模式,驅動程式設計者和應用程式開發人員可以根據需要加入物件。

  • 名稱空間
  • 國家或地區
  • 位置
  • 組織
  • 組織單位
  • 網域
  • 電腦
  • 使用者
  • 群組
  • 別名
  • 服務
  • 列印佇列
  • 列印裝置
  • 列印作業
  • 檔案服務
  • 檔案共用
  • 工作階段
  • 資源

ADSI 程式設計模式

ADSI 物件是元件物件模式 (COM) 的物件。基本上,程式設計者與 COM 物件互動的方法是透過呼叫標準 OLE 程序來取得物件 IUnknown 介面的指標。程式設計者接著呼叫 QueryInterface 來取得特定介面的指標。

透過傳統的編輯語言,如 C 和 C++ 可以使用此標準的 COM 模式呼叫所有的 Active Directory 服務介面。ADSI 提供輔助功能 ADsGetObject,簡化從特定 ADSI 物件取得所需介面指標的程序。

範例:建立使用者 (C/C++)

IADsContainer *pContainer;
IADs *pNewObject;
IADs *pNewObject;
IADsUser *pUser;

//
// Bind to the known container.
//
ADsGetObject(TEXT"WinNT://MSFT",
IID_IADsContainer,
(void**)&pContainer);

//
// Create the new Active Directory Service Interfaces User object.
//
pContainer->Create(TEXT"User",
TEXT"Jane",
&pNewObject);

//
// Get the IADsUser interface from the user object.
//
pNewObject->QueryInterface(IID_IADsUser, &pUser);

//
// Set Jane's password.
//
pUser->SetPassword(TEXT"Argus");

//
// Complete the operation to create the object.
//
pUser->SetInfo();

//
// Cleanup.
//
pContainer->Release();
pNewObject->Release();
pUser->Release();

ADSI 物件也是 OLE Automation Servers。透過 IDispatch 介面可以呼叫所有 Active Directory 服務介面。

IDispatch 是不直接使用 COM 介面的控制器的 OLE Automation 介面。透過 IDispatch 存取物件叫做名稱繫結 (name-bound) 或晚期繫結(late-bound) 存取,因為用戶端和 OLE 物件 (伺服器) 之間的連線發生在執行階段,而非連結用戶端程式時。

OLE Automation controllers,如 Visual Basic,隱藏 OLE 的內部工作並代表程式設計者呼叫 IDispatch 中所有必須的方法。程式設計者只需關心其應用程式的邏輯,而無需關心 OLE 的低階細節。

範例:建立使用者物件 (Visual Basic)

Dim Container as IADsContainer
Dim NewUser as IADsUser


' Bind to the known container.
Set Container = GetObject("WinNT://MSFT")

' Create the new Active Directory Service Interfaces User.
Set NewUser = Container.Create("User", "Jane")

' Set Jane's password.
NewUser.AccountRestrictions.SetPassword("Argus")

' Complete the operation to create the object in the directory.
NewUser.SetInfo

使用 ADSI

以下各小節描述如何將 ADSI 用於管理。

通常需要建立使用者及其屬性的清單。在此範例中,Visual Basic 指令檔擷取 ABX Compute Corporation 製造部門中 「WinNT」 名稱空間內的所有使用者。這裏每個使用者的名稱和已知的電話號碼 (目錄中所顯示的) 都被傳送到 PrintUser 常式。

範例-建立使用者清單:

dim MyUserContainer as IADsContainer
dim MyUser as IADsUser

set MyUserContainer as GetObject("WinNT://ABX")

for each MyUser in MyUserContainer
PrintUser MyUser.Name, MyUser.TelephoneNumber
next MyUser

新增使用者至群組

為安全性目的而新增使用者至群組是系統管理員經常需要做且費時的工作。在此範例中,前一個範例中的使用者被新增至 ABX 公司內的製造部門使用者群組 (如果使用者尚未屬於此群組)。

範例:新增使用者至群組

dim MyUserContainer as IADsContainer
dim MyUser as IADsUser
dim MyGroup as IADsGroup
dim Filter as Variant


Filter = Array("user");

set MyUserContainer = GetOBject("WinNT://ABX")
MyContainer.Filter = Filter ' filter out all objects except users
set MyGroup = GetObject("WinNT://ABX/Manufacturing_Users")

for each MyUser in MyUserContainer
if not MyGroup.IsMember(MyUser) then
MyGroup.Add(MyUser)
end if
next MyUser

啟動和停止服務

在此範例中,給予 John Smith 管理公司內服務的責任。他希望撰寫小指令檔來停止所有的 DHCP 服務。

例 5:啟動/停止服務

Set dom = GetObject("WinNT://ABX")
Dom.Filter = Array("Computer")
For each comp in dom
comp.Filter = Array("Service")
For each svc in comp
If ( svc.Name = Browser ) then
svc.Stop
End if
Next
Next

使用 Windows 2000 Active Directory,呼叫者還可以列舉指定組織單位發行的服務,搜尋指定企業內的所有發行的服務等。

將 ADSI 用於架構管理

讓管理員新增物件至屬性的能力是以架構為基礎的目錄服務有用的功能。例如,ABX 組織內的管理員可能希望根據標準的 ADSI User 物件來建立包含 ABX 中其他有用的屬性的 ABXuser。

假設 ABX 想要在使用者物件新增卡片密鑰號碼,並呼叫新的物件類型「ABXuser」。ADSI 可以很容易完成。首先,在架構容器內建立建立新的類別,並標記為從希望的基本類別導出的類別。新增新屬性到新的類別。下面是執行此擴充的 Visual Basic 程式碼。

範例:擴充架構

' get the Schema Path
set ds = getobject("LDAP://RootDSE") ' and from that that the schema container
set sch = getobject("LDAP://"&ds.get("schemaNamingContext"))

' create the new attribute object
set newatt = sch.create("attributeSchema","cn=CardKey")
' set the desired values
newatt.put "attributeId","1.2.840.113556.1.4.7000.16"
newatt.put "oMSyntax",20
newatt.put "attributeSyntax","2.5.5.4"
newatt.put "isSingleValued",True
' write it back to the DS
newatt.setinfo

'create a new class
set newcls = sch.create("classSchema","cn=ABXUser") ' set the desired values
newcls.put "cn","myClass"
newcls.put "governsId","1.2.840.113556.1.5.7000.12"
newcls.put "objectClassCategory",1 ' 1 = Structural Class
newcls.put "subClassOf","user"
newcls.put "possSuperiors","organizationalUnit"
newcls.setinfo


' add the new attibute (CardKey) to this class
' Values for ::PutEx are defined in one of the IADS.H include file, found in the
newcls.putex ADS_PROPERTY_APPEND,"mayContain", Array("1.2.840.113556.1.4.7000.16") 'It's Card Key's OID

' write it back to the DS
newcls.setinfo

結論

大部分的組織同時使用多個目錄。組織內出現多種目錄給使用者、管理員和程式開發人員帶來了複雜的挑戰。

ADSI 提供單一、一致的開放式介面來管理和使用多個目錄,可以解決這些問題。

ADSI 及其相關元件是簡化使用者和程式開發人員面臨的目錄使用和管理問題的有效率工具。

關於 Active Directory 服務介面的詳細資訊,請查詢 Microsoft TechNet 或到 http://www.microsoft.com/ntserver Web 網站 或 Microsoft Network 上的 Windows NT Server 論壇 (GO WORD:MSNTS)。您可以將意見傳送到 adsi@microsoft.com

© 1999 Microsoft Corporation。版權所有。

本文件包含的資訊代表 Microsoft Corporation 在發行之日對所討論問題的目前看法。因為 Microsoft 必須反應不斷變化的市場環境,故此文件不應視為 Microsoft 一方的承諾,Microsoft 不保證在發行日以後提出的資訊的準確性。

此白皮書僅用於提供資訊的目的。在本文件中 MICROSOFT 不為任何明示的或默許的保證。

Microsoft、Active Desktop、BackOffice、the BackOffice logo、MSN、Windows 和 Windows NT 是 Microsoft Corporation 在美國和/或其他國家或地區的註冊商標或商標。

此處提到的其他產品和公司名稱可能是其各擁有者的註冊商標。

Microsoft Corporation • One Microsoft Way • Redmond,WA 98052-6399 • USA

0399

 

Back to Top
 


©2009 Microsoft Corporation. 著作權所有,並保留一切權利。 連絡我們 |使用規定 |商標 |隱私權聲明
Microsoft