?一、前言
1.1 AD 域服務
什么是目錄(directory)呢?
日常生活中使用的電話薄內記錄著親朋好友的姓名、電話與地址等數據,它就是 telephone directory(電話目錄);計算機中的文件系統(file system)內記錄著文件的文件名、大小與日期等數據,它就是 file directory(文件目錄)。
如果這些目錄內的數據能夠由系統加以整理,用戶就能夠容易且迅速地查找到所需的數據,而 directory service(目錄服務)提供的服務,就是要達到此目的。在現實生活中,查號臺也是一種目錄;在 Internet 上,百度和谷歌提供的搜索功能也是一種目錄服務。
Active Directory 域內的 directory database(目錄數據庫)被用來存儲用戶賬戶、計算機賬戶、打印機和共享文件夾等對象,而提供目錄服務的組件就是 Active Directory (活動目錄)域服務(Active Directory Domain Service,AD DS),它負責目錄數據庫的存儲、添加、刪除、修改與查詢等操作。一般適用于一個局域網內。
在 AD 域服務(AD DS)內,AD 就是一個命名空間(Namespace)。利用 AD,我們可以通過對象名稱來找到與這個對象有關的所有信息。
在 TCP/IP 網絡環境內利用 Domain Name System(DNS)來解析主機名與 IP 地址的對應關系,也就是利用 DNS 來解析來得到主機的 IP 地址。除此之外,AD 域服務也與 DNS 緊密結合在一起,它的域命名空間也是采用 DNS 架構,因此域名采用 DNS 格式來命名,例如可以將 AD 域的域名命名為 moonxy.com。
1.2 AD域對象與屬性
AD 域內的資源以對象(Object)的形式存在,例如用戶、計算機與打印機等都是對象,而對象則通過屬性(Attriburte)來描述其特征,也就是說對象本身是一些屬性的集合。例如,創建一個賬戶張三,則必須添加一個對象類型(object class)為用戶的對象(也就是用戶賬戶),然后在這個用戶賬戶內輸入張三的姓名、登錄賬戶、電話號碼和電子郵件等信息,這其中的用戶賬戶就是對象,而姓名、登錄賬戶等數據就是該對象的屬性,張三就是對象類型為用戶(user)的對象。
1.3 AD 域控制器 DC
AD 域服務(AD DS)的目錄數據存儲在域控制器(Domain Controller,DC)內。一個域內可以有多臺域控制器,每臺域控制器的地位幾乎是平等的,它們各自存儲著一份幾乎完全相同的 Active Directory。當在任何一臺域控制器內添加了一個用戶賬戶后,此賬戶默認被創建在此域控制器的 Active Directory,之后會自動被復制(replicate)到其他域控制器的 Active Directory,以便讓所有域控制器內的 Active Directory 數據都能夠同步(synchronize)。
當用戶在域內某臺計算機登錄時,會由其中一臺域控制器根據其 Active Directory 內的賬戶數據,來審核用戶輸入的賬戶與密碼是否正確。如果是正確的,用戶就可以登錄成功;反之,會被拒絕登錄。域控制器是由服務器級別的額計算機來扮演的,例如 Windows Server 2012 和 Windows Server 2008 R2 等。
通常,域控制器的 Active Directory 數據庫是可以被讀寫的,除此之外,還有 Active Directory 數據庫是只可以讀取、不可以被修改的只讀域控制器(Read-Only Domain Controller,RODC)。例如,某子公司位于遠程網絡,如果安全措施并不像總公司一樣完備,則可以使用 RODC。
1.4 LDAP
LDAP(Lightweight Directory Access Protocol),輕量目錄訪問協議,是一種用來查詢與更新 Active Directory 的目錄服務通信協議。AD 域服務利用 LDAP 命名路徑(LDAP naming path)來表示對象在 AD 內的位置,以便用它來訪問 AD 內的對象。
LDAP 數據的組織方式:
LDAP 名稱路徑如下:
標識名稱(distinguished Name,DN):它是對象在 Active Directory 內的完整路徑,DN 有三個屬性,分別是 CN,OU,DC。
DC (Domain Component):域名組件;
CN (Common Name):通用名稱,一般為用戶名或計算機名;
OU (Organizational Unit):組織單位;
例如,如上用戶賬戶,其 DN 為:
CN=張三,OU=Web前端組,OU=軟件開發部,DC=moonxy,DC=com
其中 DC(Domain Component)表示 DNS 域名中的組件,例如 moonxy.com 中的 moonxy 與 com;OU為組織單位(Organization Unit);CN為通用名稱(Common Name),一般為用戶名或服務器名。除了DC與OU之外,其他都利用CN來表示,例如用戶與計算機對象都屬于CN。上述DN表示法中的 moonxy.com 為域名,軟件研發部、Web前端組都是組織單位。此 DN 表示賬戶張三存儲在 moonxy.com\軟件研發部\Web前端組路徑中。
相對標識名稱(Relative Distinguished Name,RDN):RDN用來代表DN完整路徑中的部分路徑,例如上面路徑中的 CN=張三與 OU=Web前端組等都是 RDN。
Base DN:LDAP 目錄樹的最頂部就是根,也就是所謂的 "Base DN",如 "DC=moonxy,DC=com"。
除了 DN 與 RDN 這兩個對象名稱外,另外還有如下兩個名稱:
全局唯一標識符(Global Unique Identifier,GUID):GUID 是一個128位的數值,系統會自動為每個對象指定一個唯一的GUID。雖然可以改變對象的名稱,但是其GUID永遠不會改變。
用戶主體名稱(User Principal Name,UPN):每個用戶還可以有一個比DN更短、更容易記憶的 UPN,例如上面的張三隸屬于 moonxy.com,則其 UPN 可以為 zhangsan@moonxy.com。用戶登錄時所輸入的賬戶名最好是 UPN,因為無論此用戶的賬戶被移動到哪一個域,其 UPN 都不會改變,因此用戶可以一直使用同一個名稱來登錄。
AD 與 LDAP 的關系:LDAP 是一種用來訪問 AD 數據庫的目錄服務協議,AD DS 會通過 LDAP 名稱路徑來表示對象在 AD 數據庫中的位置,以便用它來訪問 AD 數據庫內的對象。LDAP 的名稱路徑包括有 DN、RDN。
openLDAP(Linux),Active Directory(Microsoft)等是對 LDAP 目錄訪問協議的具體實現,除了實現協議的功能,還對它進行了擴展。
1.5 全局編錄
雖然在域樹內的所有域共享一個 Active Directory,但是 Active Directory 數據卻分散在各個域內,而每個域僅存儲該域本身的數據。因此,為了讓用戶、應用程序能夠快速找到位于其他域內的資源,在 AD 域服務器內設計了全局編錄(Global Catalog,GC)。
全局編錄的數據存儲在域控制器內,這臺域控制器被稱為全局編錄服務器,它存儲著林內所有域的 AD 內的每個對象。不過只存儲對象的部分屬性,這些屬性都是常用來搜索的屬性,例如用戶的電話號碼、登錄賬戶名等。全局編錄讓用戶即使不知道對象位于哪一個域內,仍然可以快速的找到所需的對象。
用戶登錄時,全局編錄服務器還負責提供該用戶所屬的通用組的信息;用戶利用 UPN 登錄時,它會負責提供該用戶隸屬于哪一個域的信息。
一個林內的所有域樹共享相同的全局編錄,而林內的第一臺域控制器默認就是全局編錄服務器。必要時,也可以另外指派其他域控制器來當做全局編錄服務器。
二、 部署AD域控制器
首先,我們檢查第一臺已經安裝Windows Server 2012 R2的服務網絡的相關配置,確定的服務器IP地址、子網掩碼、默認網關的參數如下,由于該服務器既要充當ADDC角色,又要充當網絡的DNS角色 ,所以“首先DNS服務器”中配置的IP地址輸入它自己的IP地址,即192.168.20.100,同時將來會有另外一臺輔助的ADDC會加入也會承擔DNS的角色,所以 在備用服務器中的IP地址中輸入另外一臺DNS的IP地址,即192.168.20.101,操作如下:
步驟 1 檢查服務器的IP地址:
步驟 2點擊Server2012左下角的“服務器管理器”顯示如下界面:
步驟 3點擊”管理”:
步驟 4點擊“添加角色和功能按鈕”彈出如下界面:
步驟 5這里選擇“基于角色或基于功能的安裝”,然后點“下一步”:
步驟 6服務器選擇這里選擇默認的,假如你需要針對其它主機安裝AD角色,這里可以選擇你需要的主機,點擊“下一步”:
步驟 7這里勾選“ActiveDirectory域服務”:
步驟 8當勾選這個選項時,會彈出如下對話框,點“添加功能”。
步驟 9這樣就正確選擇了安裝AD角色,點擊“下一步”
步驟 10功能頁面不需要做任何選擇直接點“下一步”
步驟 11這里是介紹AD角色的功能及注意事項,點擊“下一步”
步驟 12勾選“如果需要,自動重新啟動目標服務器”,然后點擊“安裝”
步驟 13安裝成功后我們點擊“關閉”,但這還沒有完全安裝成功
步驟 14點擊服務器右上角的“功能按鈕”, 彈出繼續配置AD的對話框
步驟 15點擊“部署后配置”,在紅框處填入相應的域名
步驟 16點擊“下一步”選擇域功能級別,選擇相應的功能,DNS/GC/RODC,最下面輸入目錄服務還原密碼在此設置密碼為:vancen.123
步驟 17點擊“下一步”后配置DNS,由于不需要委派DNS,所以這里不需要設置,直接點擊“下一步”
步驟 18這一步配置Netbios名,若沒有特殊需求默認的就可以,直接點“下一步”
步驟 19配置日志,數據庫,SYSVOL路徑,若沒有特殊需求,默認就可以
步驟 20查看配置信息,若沒有任何問題直接點“下一步”
步驟 21這個頁面是檢測是否滿足條件,滿足條件后就可以直接點“安裝”
步驟 22等待機器安裝配置項,可能需要重啟
4
步驟 23重啟后我們會4看到AD角色已經安裝完成
第一臺 ADDC已經安裝完成
三、部署額外域控制器
首先,我們檢查第二臺已經安裝Windows Server 2012 R2的服務網絡的相關配置,確定的服務器IP地址、子網掩碼、默認網關的參數如下,由于該服務器既要充當輔助的ADDC角色,又要充當網絡的DNS角色 ,所以“首先DNS服務器”中配置的IP地址輸入主域控制器的IP地址,即192.168.20.100,備用DNS服務器的IP地址輸入它自己的IP地址,即192.168.20.101,操作如下
步驟 1 檢查服務器的IP地址
步驟 2 修改計算機名為ADDC02,點擊確定
步驟 3 點擊“添加角色和功能按鈕”彈出如下界面
步驟 4這里選擇“基于角色或基于功能的安裝”,然后點“下一步”
?
步驟 5這里選擇“從服務器池中選擇服務器”,然后點“下一步”
步驟 6這里選擇“域服務所需的功能”,然后點“下一步”
步驟 7然后點“下一步”
步驟 8然后點擊“安裝”
步驟 9點擊“將此服務器提升為域控制器”
步驟 10由于是做已經建立的域的輔助域控制器,所以單擊 “向域控制器添加到現有域”
步驟 11由于域的輔助域控制器所以選擇域系統(DNS)服務器和全局編錄(GC)功能,目錄還原模塊密碼vancen.123
步驟 12選擇從主域控復制數據安裝,復制自:ADDC01.VANCEN.COM
步驟 13配置文件路徑選擇默認,點擊“下一步”
步驟 14查看腳本后,點擊“下一步”
步驟 15先決條件檢查后,點擊“安裝”
第二臺 ADDC已經安裝完成,到此兩臺域控制都已經安裝完成
四、驗證安裝
步驟 1直接打開CMD命令行,輸入“netdom query fsmo”,這時會顯示五種角色都已經安裝成功
步驟 2若要進一步驗證AD是否安裝正確,可以使用DCDIAG /a命令行
步驟 3使用Repadmin診斷工具檢查目錄復制問題,包括管理和修改復制拓撲,強制復制事件和顯示復制元數據與最新矢量。
END
前面加域腳本中提到過加域時代碼中會包含域管理員賬號和密碼,用bat腳本時可以用記事本打開腳本直接可以看到密碼,我們可以用c++將腳本打包成exe執行程序,避免使用人可以直接看到密碼。今天將前面的腳本集合一起做到c++的exe小程序中。
首先先打開c++編譯軟件,新建files,c++ source file,選擇文件名和位置,點ok,復制代碼,點擊編譯,編譯完成沒有錯誤,點擊執行,即可看到運行的效果。
測試完成后,在剛剛新建文件選擇的目錄下找到debug文件夾,進入后找到exe后綴的程序,復制到任意位置或發送給他人,雙擊既可以執行。
c++編譯軟件
#include <iostream> #include<windows.h> using namespace std; int main(){ system("@echo off"); system("color 1F"); system("mode con cols=100 lines=30"); system("title=自動改名加域腳本 by:IT運維強哥"); menu: system("cls"); cout<<endl; cout<<"自動改名加域腳本"<<endl; cout<<" [1] 自動設置IP"<<endl; cout<<" [2] 自動更改管理員密碼"<<endl; cout<<" [3] 自動更改計算機名"<<endl; cout<<" [4] 自動加域"<<endl; cout<<endl; cout<<"請輸入需執行命令前的數字:"; float input; cin>>input; if(input-(int)input==0){ if(input==1){ cout<<"設置IP為192.168.1.100"<<endl; system("netsh interface ip set address name=本地連接 static 192.168.1.100 255.255.255.0 192.168.1.1"); system("netsh interface ip set dnsservers 本地連接 static 8.8.8.8 primary"); system("netsh interface ip add dnsservers 本地連接 114.114.114.114 index=2"); system("echo IP設置成功"); system("pause"); goto menu; } else if(input==2){ cout<<"更改管理員administrator密碼"<<endl; system("net user administrator /active:yes"); system("net user administrator mima@nishengri"); system("wmic useraccount where name='administrator' call rename 'admin'"); system("echo 更改成功"); system("pause"); goto menu; } else if(input==3){ cout<<"更改計算機名"<<endl; system("set /p newcomputername=請輸入新的計算機名:"); system("wmic computersystem where name='%computername%' call rename '%newcomputername%'"); system("echo 計算機名以更改,重啟生效"); system("pause"); goto menu; } else if(input==4){ cout<<"自動加域"<<endl; system("wmic computersystem where \"name='%computername%'\" call joindomainorworkgroup name=mydomain.com username=domain.com\\domainadmin password=password fjoinoptions=3"); system("echo 返回ReturnValue=0 , 加域成功,重啟電腦"); system("pause"); goto menu; } else{ goto menu; } } else{goto menu;} return 0; }
c++編譯器和代碼
程序執行效果
c++程序源文件后綴為.cpp
基本格式
#include <iostream> using namespace std; int main(){ }
將腳本代碼改為c++代碼時要注意的區別
c++中
c++的每行代碼后面都有一個;分號
cout<< -- 表示輸出命令,加""表示文本內容,不加表示變量
cin>> -- 表示輸入
調用系統命令時需要加上
#include<windows.h>
system("");
system(""); -- 里面還有雙引號會保錯需要加\
menu: -- 跳轉的標簽冒號在后面
cout<<endl; -- 表示換行