1:清除sam文件:
WinNT系列的系統賬戶信息是存在%systemroot%\system32\config\sam這個注冊表文件裡的。如果系統裡沒有重要的賬戶,或者賬戶比較少,用刪除%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裡運行net 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
[email protected]\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);
}
============== code end ========