Windows NT使用技巧、編程原理及程序示例
[歡迎交流]
[本文最后更新:2000-09]
-
利用Net User命令和Cacls命令做用戶管理
-
利用At命令做日程管理
-
利用用戶登錄腳本實(shí)現(xiàn)開機(jī)提示
-
利用Net Session命令實(shí)現(xiàn)登錄用戶統(tǒng)計(jì)
-
Windows NT局域網(wǎng)管理API函數(shù)庫(kù)(NETAPI)簡(jiǎn)介
-
怎樣添加、刪除、配置用戶?
-
怎樣修改用戶口令?
-
怎樣編程實(shí)現(xiàn)用戶的注銷和關(guān)機(jī)?
-
怎樣獲取所有登錄用戶列表?
-
怎樣向用戶或計(jì)算機(jī)發(fā)送消息?
-
怎樣實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)?
-
UNICODE字符串和普通ASCII字符串怎樣轉(zhuǎn)換?
-
如何獲取系統(tǒng)錯(cuò)誤信息?
-
什么是Service(服務(wù))程序?
-
如何使自己的應(yīng)用程序成為Service?
-
如何編制Service程序?
利用Net命令和Cacls命令定制用戶管理
(
返回主題選擇
)[歡迎交流]
NT的“域用戶管理器”是用來(lái)管理域、成員服務(wù)器和工作站安全性的工具。使用“域用戶管理器”可以:選定要管理的域或計(jì)算機(jī);創(chuàng)建和管理用戶帳號(hào);
創(chuàng)建和管理組;管理安全性規(guī)則。通常網(wǎng)絡(luò)管理員是用“域用戶管理器”來(lái)完成。但是,“域用戶管理器”每次只能配置一個(gè)用戶,雖然NT利用組的概念實(shí)施用戶
管理,事實(shí)上對(duì)組內(nèi)用戶的配置還是單獨(dú)進(jìn)行的。
Net Group和Net User 命令行實(shí)用程序是NT下的兩個(gè)管理域用戶的重要程序。它可以完成NT域用戶管理器所能完成的所有功能,其區(qū)別僅在于不具備友好的界面。Net
Group命令行實(shí)用程序用于在Windows NT Server
域中添加、顯示或更改全局組。該命令僅在 Windows
NT Server 域中可用。Net User命令行實(shí)用程序用于添加或更改用戶帳號(hào)或顯示用戶帳號(hào)信息。靈活應(yīng)用這兩個(gè)程序,可以完成許多“域用戶管理器”不能完成的功能,例如:建立批量用戶,詳細(xì)設(shè)置每個(gè)用戶目錄的權(quán)限等等。
通常在建立用戶組的時(shí)候,需要建立一個(gè)和組名相匹配的用戶目錄,并設(shè)置此目錄的安全性使得該目錄只能被管理員和該組成員訪問(wèn)。現(xiàn)在建立一個(gè)名為“實(shí)驗(yàn)組A”的用戶組,并為該組設(shè)立一個(gè)管理員,可以執(zhí)行下面的批命令:
Net Group 實(shí)驗(yàn)組A /Add /Comment:”建立用戶組實(shí)驗(yàn)” //建立組
Net User Admin_LabA /Add /Comment:”實(shí)驗(yàn)組A管理員” //建立組管理員
Net Group 實(shí)驗(yàn)組A Admin_LabA /Add //將組管理員加入組
再為此組建立一個(gè)私有目錄,執(zhí)行下面的命令:
Md \\ServerName\STUDENT\實(shí)驗(yàn)組A
Cacls \\ServerName\STUDENT\實(shí)驗(yàn)組A /r everyone /e /t
Cacls \\ServerName\STUDENT\實(shí)驗(yàn)組A /g 實(shí)驗(yàn)組A:r /e /t
Cacls \\ServerName\STUDENT\實(shí)驗(yàn)組A /g Administrator:f /e /t
現(xiàn)在建立該組下的一般成員,運(yùn)行下面的命令:
Net User User001 /Add /Comment:”實(shí)驗(yàn)組A一般用戶”
Net Group 實(shí)驗(yàn)組A User001 /Add
為該用戶建立自己的私有目錄(此目錄將只能由管理員、該組管理員和User001訪問(wèn))
Md \\ServerName\STUDENT\實(shí)驗(yàn)組A\User001
Cacls \\ServerName\STUDENT\實(shí)驗(yàn)組A /r 實(shí)驗(yàn)組A:r /e /t
Cacls \\ServerName\STUDENT\實(shí)驗(yàn)組A\User001 /g User001:f /e /t
利用At命令做日程管理
(
返回主題選擇
)[歡迎交流]
作為一個(gè)教學(xué)實(shí)驗(yàn)室,需要由極少數(shù)的管理人員維護(hù)批量的計(jì)算機(jī)。鑒于教學(xué)實(shí)驗(yàn)室的工作特性,經(jīng)常需要管理人員定期地對(duì)實(shí)驗(yàn)室中計(jì)算機(jī)進(jìn)行硬盤清理、文件復(fù)
制的工作。重復(fù)性的勞動(dòng)不僅降低了工作效率,更重要的是,經(jīng)常由此引入操作失誤。將一些不要求交互輸入的系統(tǒng)維護(hù)程序安排到計(jì)算機(jī)的調(diào)度命令中,不僅可以
讓計(jì)算機(jī)協(xié)助完成工作,計(jì)算機(jī)執(zhí)行調(diào)度命令的可靠性也決不會(huì)有任何錯(cuò)誤和紕漏。故而,將計(jì)算機(jī)的日程管理?xiàng)l理化,是改變教學(xué)實(shí)驗(yàn)室傳統(tǒng)人工管理、將教學(xué)實(shí)
驗(yàn)室管理納入現(xiàn)代化的必然。以下將以具體實(shí)例說(shuō)明公用實(shí)驗(yàn)室管理措施在NT調(diào)度服務(wù)下的實(shí)現(xiàn)。
機(jī)房定時(shí)提示關(guān)機(jī)并定時(shí)強(qiáng)制關(guān)機(jī)的實(shí)現(xiàn)。為了實(shí)現(xiàn)自動(dòng)關(guān)機(jī)提示并關(guān)機(jī),首先要編制NT下的注銷程序和關(guān)閉系統(tǒng)程序。可以調(diào)用WindowsAPI中的
ExitWindows()和ExitWindowsEx()函數(shù),需要立即強(qiáng)制注銷,只需要在程序中調(diào)用ExitWindows(0,0);需要立即強(qiáng)
制關(guān)機(jī),只需要在程序中調(diào)用ExitWindowsEx(EWX_POWEROFF|
EWX_FORCE)即可(如果需要配置為重新啟動(dòng)等其他要求,請(qǐng)查閱WindowsAPI中此二函數(shù)的具體參數(shù))。假設(shè)已經(jīng)做好注銷程序
ScheduleLogoff.exe和關(guān)機(jī)程序ScheduleShutdown.exe并將它們拷貝到c:\winnt。運(yùn)行如下命令:
at \\MyStation 21:55 /every: M,T,W,Th,F,S,Su
c:\winnt\ScheduleLogoff.exe
at \\MyStation 22:00 /every: M,T,W,Th,F,S,Su
c:\winnt\ScheduleShutdown.exe
則在每天的晚9:55自動(dòng)強(qiáng)制名為MyStation的計(jì)算機(jī)上的用戶注銷并在5分鐘后自動(dòng)關(guān)閉該計(jì)算機(jī)。建議在強(qiáng)制用戶注銷之前幾分鐘,給用戶發(fā)送關(guān)機(jī)提示以便用戶有足夠的時(shí)間保存文件,可以用net
send命令行程序來(lái)完成這一功能。具體使用如下:
at \\MyStation 21:55 /every: M,T,W,Th,F,S,Su “cmd /c net send
請(qǐng)立即保存程序,5分鐘后系統(tǒng)將自動(dòng)關(guān)閉!”
這樣,就可以完全的由計(jì)算機(jī)來(lái)控制整個(gè)實(shí)驗(yàn)室所有計(jì)算機(jī)的自動(dòng)關(guān)機(jī)時(shí)間,而機(jī)房管理人員則可以將主要精力用于實(shí)驗(yàn)輔導(dǎo)而非系統(tǒng)管理。
教學(xué)實(shí)驗(yàn)室還經(jīng)常需要進(jìn)行硬盤整理(如Scandisk.exe)和硬盤清理(如刪除用戶空間)。同樣也可以將所需執(zhí)行的功能編制為應(yīng)用程序并加入系統(tǒng)的
調(diào)度命令。如安排每周一早晨進(jìn)行磁盤整理;每天關(guān)機(jī)前進(jìn)行用戶磁盤空間的清理。合理地調(diào)度命令安排,將使機(jī)房的管理日程化,同時(shí)提高有盤工作站的安全系
數(shù)。在多媒體實(shí)驗(yàn)室的實(shí)際應(yīng)用中,將用戶管理和日程安排相結(jié)合,實(shí)現(xiàn)了NT有盤工作站的安全防拷貝。
利用用戶登錄腳本實(shí)現(xiàn)開機(jī)提示
(
返回主題選擇
)[歡迎交流]
用戶的登錄腳本(登錄腳本存放的路徑是:“%systemroot%\system32\REPL\IMPORT\SCRIPTS”)是在用戶登錄
時(shí)候運(yùn)行的,在此程序中,可以根據(jù)需要加入有關(guān)的代碼,實(shí)現(xiàn)特殊的功能。如果將有關(guān)實(shí)驗(yàn)室的介紹和試驗(yàn)內(nèi)容放置在網(wǎng)站上,則可以在登錄腳本中訪問(wèn)這個(gè)網(wǎng)站
從而實(shí)現(xiàn)開機(jī)提示或聯(lián)機(jī)幫助系統(tǒng)。多媒體通信實(shí)驗(yàn)室目前設(shè)置為在登錄腳本中打開Internet
Explorer并連接實(shí)驗(yàn)室主頁(yè),從而實(shí)現(xiàn)開機(jī)提示和聯(lián)機(jī)幫助。如果您使用VC來(lái)編寫這個(gè)登錄腳本,則簡(jiǎn)單地調(diào)用ShellExecute()函數(shù)來(lái)打
開網(wǎng)站地址即可。例如:
ShellExecute(NULL,"open","http://192.168.1.20",NULL,NULL,SW_MAXIMIZE);
利用Net Session命令實(shí)現(xiàn)登錄用戶統(tǒng)計(jì)
(
返回主題選擇
)[歡迎交流]
Net Session是NT下的一個(gè)命令行程序。運(yùn)行它可以列出或斷開本地計(jì)算機(jī)和與之連接的客戶端的會(huì)話。其基本的使用格式為:
net session [\\computername] [/delete]。
其命令參數(shù)為:
\\computername 標(biāo)識(shí)要列出或斷開會(huì)話的計(jì)算機(jī)。
/delete 結(jié)束與 \\computername
計(jì)算機(jī)會(huì)話并關(guān)閉本次會(huì)話期間計(jì)算機(jī)的所有打開文件。如果省略
\\computername
參數(shù),將取消與本地計(jì)算機(jī)的所有會(huì)話。
如果鍵入不帶參數(shù)的 net session
則可以顯示所有與本地計(jì)算機(jī)的會(huì)話的信息。
要顯示某個(gè)用戶的會(huì)話,請(qǐng)?jiān)诿钪刑砑?
\\computername
參數(shù)。單個(gè)用戶的顯示還包括用戶所連接到的共享資源列表。當(dāng)客戶機(jī)用戶與服務(wù)成功連接時(shí),將記錄該會(huì)話。當(dāng)兩個(gè)系統(tǒng)在同一個(gè)網(wǎng)絡(luò)中,并且服務(wù)器接受用戶名
和密碼時(shí),就出現(xiàn)成功會(huì)話。客戶機(jī)用戶必須先與服務(wù)器建立會(huì)話,才能使用服務(wù)器資源,而且客戶機(jī)用戶在建立與服務(wù)器的會(huì)話之前必須連接到網(wǎng)絡(luò)資源。客戶端
和服務(wù)器之間只能有一個(gè)會(huì)話,但可以有許多資源入口點(diǎn)和與資源的連接。要設(shè)置在自動(dòng)斷開某個(gè)會(huì)話之前暫停的時(shí)間,請(qǐng)使用
net config server 命令的 /autodisconnect 選項(xiàng)設(shè)置
autodisconnect 特征。自動(dòng)斷開連接對(duì)用戶是透明的,因?yàn)楫?dāng)用戶再次使用資源時(shí),Windows
NT 自動(dòng)重新連接會(huì)話。要結(jié)束與服務(wù)器的會(huì)話,使用
/delete 選項(xiàng)與 \\computername。
net session 命令也可以寫為 net sessions或net sess。使用
net session 命令顯示訪問(wèn)服務(wù)器的計(jì)算機(jī)名和用戶名、它們是否打開文件及每個(gè)用戶會(huì)話的空閑時(shí)間。顯示結(jié)果類似于下面的內(nèi)容:
計(jì)算機(jī) 用戶名 客戶類型 打開空閑時(shí)間
\\BASSETT CHRISDR NT 1 00:00:13
\\SHARONCA Administrator DOS LM 2.1 0 01:05:13
根據(jù)這個(gè)顯示結(jié)果,我們可以得到實(shí)時(shí)的再線用戶信息。利用重定向功能將顯示的結(jié)果送入一個(gè)臨時(shí)文本(net
session > tmp_sessions.txt),分析該文本格式并由NT計(jì)算機(jī)名用戶名長(zhǎng)度要求可知:計(jì)算機(jī)名、用戶名和客戶類型均固定占用占用22個(gè)字符的長(zhǎng)度。故可以從此文本中分離在線計(jì)算機(jī)和在線用戶的信息,從而實(shí)現(xiàn)在線用戶的統(tǒng)計(jì)和監(jiān)控。
Windows NT局域網(wǎng)管理API函數(shù)庫(kù)(NETAPI)
(
返回主題選擇
)[歡迎交流]
在Windows NT
的系統(tǒng)目錄下,存放有關(guān)于局域網(wǎng)管理的動(dòng)態(tài)鏈接庫(kù)NetAPI32.DLL。含有一組網(wǎng)絡(luò)管理的函數(shù)定義。這些函數(shù)被分成以下類型:
英文名稱 |
中文解釋 |
Alert functions |
網(wǎng)絡(luò)警告函數(shù) |
ApiBuffer functions |
內(nèi)存管理函數(shù) |
Distributed File System (Dfs) functions |
分布文件系統(tǒng)管理函數(shù) |
File functions |
文件管理函數(shù) |
Group functions |
組管理函數(shù) |
Local Group functions |
本地組管理函數(shù) |
Message functions |
消息管理函數(shù) |
Remote Utility functions |
遠(yuǎn)程信息服務(wù)函數(shù) |
Replicator functions |
復(fù)制服務(wù)管理函數(shù) |
Schedule functions |
日程管理函數(shù) |
Server functions |
服務(wù)器管理函數(shù) |
Service functions |
服務(wù)管理函數(shù) |
Session functions |
會(huì)話管理函數(shù) |
Share functions |
共享資源管理函數(shù) |
Statistics functions |
網(wǎng)絡(luò)統(tǒng)計(jì)函數(shù) |
User functions |
用戶管理函數(shù) |
Workstation and workstation user functions |
工作站及工作站用戶管理函數(shù) |
所有表中列出的函數(shù),囊括了Windows NT所有的網(wǎng)絡(luò)管理功能,合理地使用這些函數(shù),可以編制功能強(qiáng)大的Windows
NT網(wǎng)絡(luò)管理軟件。例如現(xiàn)在比較流行的一些英文版Windows
NT工具如:RemoteShutdown(遠(yuǎn)程關(guān)機(jī))、svcmgr(遠(yuǎn)程服務(wù)管理)、Devicelock(外設(shè)權(quán)限設(shè)置)等軟件全部都是在這些網(wǎng)絡(luò)管理函數(shù)基礎(chǔ)上實(shí)現(xiàn)的。
什么是Service(服務(wù))程序?
(
返回主題選擇
)[歡迎交流]
Service程序和普通的應(yīng)用程序有一個(gè)根本的區(qū)別:Service程序可以在無(wú)用戶登錄和用戶已經(jīng)注銷的情況下運(yùn)行,而應(yīng)用程序在沒(méi)有用戶注銷
的時(shí)候是會(huì)被終止的。您可以通過(guò)控制面板的“服務(wù)”項(xiàng)來(lái)啟動(dòng)、暫停和停止一個(gè)服務(wù)的運(yùn)行,當(dāng)然您也可以通過(guò)網(wǎng)絡(luò)來(lái)訪問(wèn)其他裝有Windows
NT的計(jì)算機(jī)(當(dāng)然可能需要安裝特定的程序例如:svcmgr)。
在Windows NT 下,各種Service都存在Service Control Manager Database中,因此我們可以通過(guò)對(duì)Service Control Manager Database進(jìn)行操作來(lái)實(shí)現(xiàn)對(duì)Service的編
程。從而用自己的程序來(lái)啟動(dòng)、停止、和暫停一個(gè)服務(wù)的運(yùn)行
。(Delphi下的例子:Delphi-Service.pas)
如何使自己的應(yīng)用程序成為Service?
(
返回主題選擇
)[歡迎交流]
[方法一] 利用工具軟件
(1)在nt的toolkit里有個(gè)應(yīng)用軟件(srvinstw.exe)可以把普通程序設(shè)成service
(2)Rehan Nadeem的AppWizard
to Create MFC Based Windows NT Service Projects
[方法二] 直接修改注冊(cè)表(推薦)
(1)打開鍵:“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”
(2)新建一個(gè)項(xiàng)名為“<你的服務(wù)的名字>”
(3)在它下面建立以下鍵
“DisplayName”,字符串類型,值為“<你希望在控制面板服務(wù)項(xiàng)打開的時(shí)候能夠看到的服務(wù)顯示的名稱>”;
“Description”,字符串類型,值為“<關(guān)于服務(wù)的簡(jiǎn)要說(shuō)明>”;
“ImagePath”,字符串類型,值為“<你的可執(zhí)行文件的全路徑>”;
“ObjectName”,字符串類型,值為“<LocalSystem>”;
“ErrorControl”,DWORD類型,值為“0”
“Start”,DWORD類型,值為“0x00000003”
“Type”,DWORD類型,值為“0x00000110”
建議自己寫一個(gè)MyService.REG文件直接運(yùn)行即可,內(nèi)容如下:
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<你的服務(wù)的名字>]
"DisplayName"="<你希望在控制面板服務(wù)項(xiàng)打開的時(shí)候能夠看到的服務(wù)顯示的名稱>"
"Description"="<關(guān)于服務(wù)的簡(jiǎn)要說(shuō)明>"
"ImagePath"="<你的可執(zhí)行文件的全路徑>"
"ObjectName”,字符串類型,值為“<LocalSystem>”;
"ErrorControl"=dword:00000000
"Start"=dword:00000003
"Type"=dword:00000110
如何編制Service程序?
(
返回主題選擇
)[歡迎交流]
[編制Service程序的例子]
(1)用Delphi制作。“New”一個(gè)“Service Application”即可
(2)用VC制作。這里提供兩個(gè)例子:ntservice_sample_project.zip(推薦)、cntservice_src.zip
[Windows98下使一個(gè)應(yīng)用程序成為一個(gè)Service](只適用于Windows98)
在自己的應(yīng)用程序的開始部分加入以下代碼:
HINSTANCE hDllInst = LoadLibrary("KERNEL32.DLL");
//Windows2000下的kernel.dll中沒(méi)有RegisterServiceProcess函數(shù)
if(hDllInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC RegisterServiceProcessAlias = NULL;
RegisterServiceProcessAlias = (MYFUNC)GetProcAddress(hDllInst,
"RegisterServiceProcess");
if(RegisterServiceProcessAlias)
{
RegisterServiceProcessAlias(GetCurrentProcessId(),1);
}
FreeLibrary(hDllInst);
}
用戶的注銷和關(guān)機(jī)實(shí)現(xiàn)
(
返回主題選擇
)[歡迎交流]
和Windows 9x下不同,如果編程實(shí)現(xiàn)關(guān)機(jī)和用戶注銷,必須先取得有關(guān)的權(quán)限。
需要利用LookupPrivilegeValue()函數(shù)和AdjustTokenPrivileges()函數(shù)來(lái)獲取關(guān)閉系統(tǒng)有關(guān)的權(quán)限“SE_SHUTDOWN_NAME”;然后再調(diào)用關(guān)閉系統(tǒng)函數(shù)ExitWindows()。上述函數(shù)使用示例請(qǐng)參照ShutDown.Cpp文件中格式。
如果您需要從網(wǎng)絡(luò)關(guān)閉系統(tǒng),請(qǐng)參照怎樣實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)?。
如果在您選擇了ExitWindows()函數(shù)的參數(shù)以后仍然不能關(guān)閉計(jì)算機(jī)的電源,請(qǐng)參照怎樣使Windows NT4.0關(guān)閉系統(tǒng)的時(shí)候關(guān)閉電源?
所有登錄用戶列表獲取
(
返回主題選擇
)[歡迎交流]
獲取用戶列表過(guò)程為:獲取當(dāng)前NT局域網(wǎng)上的所有工作站和服務(wù)器信息(利用函數(shù)NetServerEnum());獲取每一臺(tái)工作站和服務(wù)器上的用戶信息(利用函數(shù)NetWkstaUserEnum())并加入自己的列表。上述函數(shù)調(diào)用格式請(qǐng)參照KeeperDlg.cpp文件中的OnGetWksList()函數(shù)和GetWksLogonUser()函數(shù)。
該文件中還用了NETAPI函數(shù)組的內(nèi)存分配函數(shù)(NetApiBufferAllocate()
和NetApiBufferFree()),本人在使用過(guò)程中發(fā)現(xiàn)釋放內(nèi)存時(shí)調(diào)用NetApiBufferFree()函數(shù)經(jīng)常出錯(cuò),如果您有什么建議請(qǐng)與本人聯(lián)系。
UNICODE字符串和普通ASCII字符串的轉(zhuǎn)換
(
返回主題選擇
)[歡迎交流]
在編寫Windows
NT應(yīng)用程序的時(shí)候,經(jīng)常會(huì)遇到一個(gè)問(wèn)題:函數(shù)的參數(shù)是“LPWSTR”類型,即UNICODE字符串,而我們平常的字符串是ASCII字符串。所以編寫
一個(gè)通用的“LPWSTR”類型字符串和“LPSTR”類型字符串的轉(zhuǎn)換程序是非常必要的。可以參考KeeperDlg.cpp文件中的ASCIIToUnicode(LPSTR
SourceStr)函數(shù)和UnicodeToASCII(LPWSTR SourceStr)函數(shù)。
向用戶和計(jì)算機(jī)發(fā)送消息
(
返回主題選擇
)[歡迎交流]
利用NETAPI中的NetMessageNameAdd()函數(shù)、NetMessageBufferSend()函數(shù)和NetMessageNameDel()函數(shù)實(shí)現(xiàn),具體調(diào)用格式請(qǐng)參照KeeperDlg.cpp文件中的NetSendMsg(LPSTR
WksName)函數(shù)。
遠(yuǎn)程關(guān)機(jī)的實(shí)現(xiàn)
(
返回主題選擇
)[歡迎交流]
用ExitWindow()和exitWindowEx()函數(shù)只能實(shí)現(xiàn)本地計(jì)算機(jī)的用戶注銷與系統(tǒng)關(guān)閉(注意:此時(shí)需要獲取有關(guān)的操作權(quán)限,具體參照怎樣編程實(shí)現(xiàn)用戶的注銷和關(guān)機(jī)?),如果需要通過(guò)網(wǎng)絡(luò)遠(yuǎn)程關(guān)機(jī),則應(yīng)該調(diào)用InitiateSystemShutdown()函數(shù),具體調(diào)用格式如下:
InitiateSystemShutdown((LPTSTR)WksName,
"系統(tǒng)1分鐘將會(huì)自動(dòng)關(guān)閉,請(qǐng)保存文件到服務(wù)器!",
60,
TRUE,
FALSE
);
用戶添加、刪除和配置
(
返回主題選擇
)[歡迎交流]
NETAPI函數(shù)庫(kù)中函數(shù)引用的數(shù)據(jù)類型在VC的相應(yīng)頭文件中有定義。如:
USER_INFO_0 、USER_INFO_1 、USER_INFO_2
等是有關(guān)用戶管理函數(shù)所用到的部分結(jié)構(gòu)體。詳細(xì)的信息可以閱讀Windows
API函數(shù)庫(kù)介紹。下面給出幾個(gè)簡(jiǎn)單的用戶管理函數(shù)的應(yīng)用。
1 添加新用戶的實(shí)現(xiàn)
USER_INFO_1 user_info;
DWORD parm_err = 0;
user_info.usri1_name = L"SampleUser";
user_info.usri1_password = L"123456";
user_info.usri1_priv = USER_PRIV_USER;
user_info.usri1_comment = L"Sample User";
user_info.usri1_flags = UF_SCRIPT;
result = NetUserAdd( NULL,1,(LPBYTE)&user_info, &parm_err
);
if(result != NERR_Success) ErrorMsg("建立用戶失敗!",result);
2 刪除用戶的實(shí)現(xiàn)
LPWSTR username = L"bb";
LPWSTR servername = L"mmc";
result = NetUserDel(servername,username);
if(result != NERR_Success) ErrorMsg("用戶刪除失敗!",result);
3 配置現(xiàn)有用戶
USER_INFO_1 user_info;
DWORD parm_err = 0;
user_info.usri1_name = L"SampleUser";
user_info.usri1_password = L"123456";
user_info.usri1_priv = USER_PRIV_USER;
user_info.usri1_comment = L"Sample User";
user_info.usri1_flags = UF_SCRIPT;
result = NetUserSetInfo(lpszPrimaryDC, lpszUser, 1,
(LPBYTE)&user_info, &parm_err );
if(result != NERR_Success) ErrorMsg("配置用戶失敗!",result);
修改用戶口令的實(shí)現(xiàn)
(
返回主題選擇
)[歡迎交流]
調(diào)用函數(shù)NetUserChangePassword(),具體格式參照以下內(nèi)容:
OnChangePassword()
{
LPWSTR wUserName = L"aa";
LPWSTR wComputerName = L"mmc";
LPWSTR wOldPassword = L"aaabbb";
LPWSTR wNewPassword = L"123456";
NET_API_STATUS nas;
nas = NetGetDCName(NULL,
L"mmc_lab",
(LPBYTE *)&wComputerName
);
if(nas != NERR_Success) {
ErrorMsg("主控域查找失敗!",nas);
}
nas = NetUserChangePassword(
wComputerName,
wUserName,
wOldPassword,
wNewPassword
);
if(nas == NERR_InvalidComputer){
MessageBox(NULL, "Invalid Computer Error!", MB_OK);
}
if(nas == NERR_UserNotFound){
MessageBox(NULL, "User not found Error!", MB_OK);
}
if(nas == ERROR_ACCESS_DENIED){
MessageBox(NULL, "Access deny Error!", MB_OK);
}
if(nas == NERR_NotPrimary){
MessageBox(NULL, "NOT primary Error!", MB_OK);
}
if(nas == NERR_PasswordTooShort){
MessageBox(NULL, "PasswordTooShort Error!", MB_OK);
}
if(nas != NERR_Success) {
ErrorMsg("密碼更改失敗!",nas);
// DisplayErrorText( nas );
}
else{
MessageBox("OK!",NULL,MB_OK);
}
}
獲取系統(tǒng)錯(cuò)誤信息
(
返回主題選擇
)[歡迎交流]
在函數(shù)執(zhí)行完畢的時(shí)候,調(diào)用ErrorMsg("XX函數(shù)執(zhí)行錯(cuò)誤信息",GetLastError());
void ErrorMsg(CString Msg,DWORD dwLastError)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox((LPCTSTR )lpMsgBuf, Msg, MB_OK);
LocalFree( lpMsgBuf );
}