1:清除sam檔案:
WinNT系列的系統賬戶訊息是存在%systemroot%\system32\config\sam這個註冊表檔堛滿C如果系統堥S有重要的賬戶,或是賬戶比較少,用移除%systemroot%\system32\config\sam的方法是比較簡單的,不過因為系統會還原為祇有administrator(密碼為空)和guest二個賬戶,所以有些常式因為牠們所依賴的賬戶丟失了,如iis、vmware就不能啟動了。
原來聽說這種方法只能適用於nt workstation系列(2kpro),不能用於server,我在2000professional和2000 advanced server上試驗都是成功的。不知道為什麼會有上述說法,可能是作用中目錄ad下不行吧。
當然首先你要能夠存取系統分區,來把sam檔案改名或是移除。如果是fat32、fat分區,使用98啟動磁片就行了。如果是ntfs分區,可以使用winternal的ntfs for dos、ntfs for 98或是是支援ntfs的啟動光碟,再或是掛到其它win2000、linux等機器上,再再或是重新裝設一個新的win2000。
2:專用工具:
windows管理員密碼丟失還有一個解決方法是使用Petter Nordahl-Hagen的The Offline NT Password Editor(http://home.eunet.no/~pnordahl/ntpasswd/),這個工具是離線修改註冊表檔sam來設定密碼的。需要用他的映像檔案製作啟動磁片來引導,進而存取ntfs分區重新設定密碼;雖然作者經常更新他的常式,不過我還是會擔心他直接作業sam文檔的安全性,可能有時會導致系統出錯。可能還有其它類似工具吧,恕我無知。
3:還有一種想法就是用一個修改密碼的小常式來取代系統啟動的必要常式,然後系統啟動時就會取代密碼,隨後把被取代的常式在還原就行了。當然首先你還是要能夠存取系統分區,來取代隨系統啟動的常式。
取代系統啟動的必要常式的一種方法是我寫的一個清除administrator密碼的小常式(CleanPwd http://www.BingleSite.net/myprog/CleanPwd/CleanPwd.rar),他所作的就是把administrator密碼清空。使用方法如下:
1):用雙系統或是啟動磁片或是掛到別的系統上,如果是NTFS分區其它系統或啟動磁片要能讀寫NTFS分區,把windows裝設目錄下的system32\svchost.exe改名svchost.bak.exe備份,把CleanPwd.exe拷貝成svchost.exe。
2):啟動該系統,就把administrator的密碼清空了,可以直接登陸。
3):把svchost.bak.exe 存回就行了(如果使用取代的是svchost,最好再啟動rpc伺服)。為什麼選用svchost.exe而不是其它常式,因為每個windows2000系統都有這幾個行程,System(kernel Executive and kernel)、smss(session manager)、csrss(win32 subsystem)、winlogon(logon process)、services(Service control manager)、lsass(local security authentication server ) 如果任何一個被殺掉或是出錯,系統將重新啟動。不過在lsass啟動之前你不能修改密碼,所以不能選用這幾個常式。
另外系統中一般還有以下一些常式:svchost.exe(Remote Procedure Call (RPC) 還有其它一些伺服)、WBEM\WinMgmt.exe(Windows Management Instrumentation)、mstask.exe(Task Scheduler)、regsvc.exe(Remote Registry Service) 可能還有其它伺服程式,你可能禁止了除RPC之外的其它伺服,但不會禁止rpc,否則系統工作就不正常了。所以我選擇了svchost,如果你知道其它伺服會自動啟動,你也可以選擇它。當然如果系統裝設了殺毒軟體的話,你取代殺毒軟體也可以,因為一般殺毒軟體都會在系統啟動是啟動殺毒防火牆來殺毒的。
4):其它:有這個想法是幾個月之前了,不過一直沒有寫這個常式:(常式執行會在c:\CleanPwd.txt記一個簡單的日誌,我也附了源碼,你可以任意修改它以滿足自己的要求,比如加入一個使用者而不是修改管理員的密碼(或是你把管理員改名了)。
4:我還在一個網站上看到這樣一個方法:就是把%systemroot%\system32\logon.scr取代為cmd.exe或是explorer.exe,然後在系統登陸處等待,過一會,系統就會去執行logon.scr這個屏保,因為你取代了這個屏保檔案,所以實際上執行的是cmd.exe或是explorer.exe,並且是localsystem權限,于是你可以隨便了,最簡單的就是在cmd.exe堸鶡熡et user administrator "",成功後管理員密碼也被清空了,關閉cmd或是explorer就可以用空密碼登陸了。其實這種方法和上邊的那種思路是一致的。
=============code begin=======================
#include
#include
#include
#include
#include
#pragma comment(lib, "Netapi32.lib")
#define LOF_FILE "c:\\cleanpwd.txt"
DWORD SetUserPwd(char *user, char *pass);
void banner(FILE *fp)
{
if(NULL == fp)return;
fprintf(fp, "Clean administrator's password tool 1a. for lost password.\n");
fprintf(fp, " by bingle@email.com.cn\n");
fprintf(fp, "Website: www.BingleSite.net\n");
}
int main(int argc, char *argv[])
{
banner(stderr);
FILE *fp = fopen(LOF_FILE, "a");
if(fp)
{
fprintf(stderr, "Log in file %s\n", LOF_FILE);
banner(fp);
}
if(!fp) fp = stderr;
char buff[256];
fprintf(fp, "%s: clean administrator's password ", _strtime(buff));
DWORD n = SetUserPwd("administrator", "");
if(NERR_Success == n) fprintf(fp, "ok.\n");
else fprintf(fp, "failed, error:%d\n", n);
fclose(fp);
return -1;
}
DWORD SetUserPwd(char *user, char *pass)
{
wchar_t wuser[PWLEN], wpass[PWLEN];
USER_INFO_1003 ui;
mbstowcs(wuser, user, strlen(user)+1);
mbstowcs(wpass, pass, strlen(pass)+1);
ui.usri1003_password = wpass;
return NetUserSetInfo(NULL, wuser, 1003, (LPBYTE)&ui, NULL);
}