Windows NT使用技巧、編程原理及程序示例 [歡迎交流]

[本文最后更新:2000-09]

  1. 利用Net User命令和Cacls命令做用戶管理
  2. 利用At命令做日程管理
  3. 利用用戶登錄腳本實(shí)現(xiàn)開機(jī)提示
  4. 利用Net Session命令實(shí)現(xiàn)登錄用戶統(tǒng)計(jì)
  5. Windows NT局域網(wǎng)管理API函數(shù)庫(kù)(NETAPI)簡(jiǎn)介
  6. 怎樣添加、刪除、配置用戶?
  7. 怎樣修改用戶口令?
  8. 怎樣編程實(shí)現(xiàn)用戶的注銷和關(guān)機(jī)?
  9. 怎樣獲取所有登錄用戶列表?
  10. 怎樣向用戶或計(jì)算機(jī)發(fā)送消息?
  11. 怎樣實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)?
  12. UNICODE字符串和普通ASCII字符串怎樣轉(zhuǎn)換?
  13. 如何獲取系統(tǒng)錯(cuò)誤信息?
  14. 什么是Service(服務(wù))程序?
  15. 如何使自己的應(yīng)用程序成為Service?
  16. 如何編制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 NadeemAppWizard 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 );
}