<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    編輯本段SC命令功能
      SC命令是XP系統(tǒng)中功能強(qiáng)大的DOS命令,SC命令能與“服務(wù)控制器”和已安裝設(shè)備進(jìn)行通訊。SC命令的功能有
      1、SC可以 檢索和設(shè)置有關(guān)服務(wù)的控制信息。可以使用 SC.exe 來測(cè)試和調(diào)試服務(wù)程序。
      2、可以設(shè)置存儲(chǔ)在注冊(cè)表中的服務(wù)屬性,以控制如何在啟動(dòng)時(shí)啟動(dòng)服務(wù)應(yīng)用程序,以及如何將其作為后臺(tái)程序運(yùn)行。即更改服務(wù)的啟動(dòng)狀態(tài)。
      3、SC 命令還可以用來刪除系統(tǒng)中的無用的服務(wù)。(除非對(duì)自己電腦中的軟硬件所需的服務(wù)比較清楚,否則不建議刪除任何系統(tǒng)服務(wù),尤其是基礎(chǔ)服務(wù))
      4、SC命令 的參數(shù)可以配置指定的服務(wù),檢索當(dāng)前服務(wù)的狀態(tài),也可以停止和啟動(dòng)服務(wù)(功能上類似NET STOP/START命令,但SC速度更快且能停止更多的服務(wù))。
      5、可以創(chuàng)建批處理文件來調(diào)用不同的 SC 命令,以自動(dòng)啟動(dòng)或關(guān)閉服務(wù)序列。
      SC.exe 提供的功能類似于“控制面板”中“管理工具”項(xiàng)中的“服務(wù)”。
    編輯本段SC命令列表及格式
      SC命令不能單獨(dú)使用,必須和其它的命令結(jié)合起來一起使用。一共有24個(gè),如下所示
      sc boot sc config sc continue sc control sc create sc delete sc descrīption sc enumdepend
      sc failure sc getdisplayname sc getkeyname sc interrogate sc lock sc pause sc qc
      sc qdescrīption sc qfailure sc query sc queryex sc querylock sc sdset sc sdshow
      sc start sc stop
      在命令行中直接輸入SC會(huì)顯示SC命令的幫助信息,直接輸入以上24個(gè)命令除sc query 和 sc queryex之外都將顯示該SC命令的幫助信息。(輸入sc query和sc queryex會(huì)顯示當(dāng)前系統(tǒng)中正在運(yùn)行的所有服務(wù)的詳細(xì)信息,但sc queryex比sc query顯示的信息多出來兩項(xiàng):PID和FLAGS)
      SC命令的格式:SC [Servername] command Servicename [Optionname= Optionvalues]
      Servername:指定服務(wù)所在的遠(yuǎn)程服務(wù)器的名稱。名稱必須采用通用命名約定 (UNC) 格式(“\\myserver”)。要在本地運(yùn)行SC.exe,請(qǐng)忽略此參數(shù)。
      command :即以上提到的那24個(gè)命令(SC后面的那個(gè),如query,start,stop,create,config等)
      Servicename:服務(wù)名,也就是要配置的那個(gè)服務(wù)的名字,例如你要啟動(dòng)一個(gè)服務(wù)你就輸入sc start +你要啟動(dòng)的服務(wù)名。(注意這里的服務(wù)名不是服務(wù)的顯示名稱,而是服務(wù)名稱,這個(gè)服務(wù)名稱可以在系統(tǒng)管理工具下的服務(wù)中可以看到,例如在服務(wù)中雙擊DHCP Client可以看到其服務(wù)名稱是Dhcp,而那個(gè)DHCP Client是顯示名稱,可以用sc命令來更改一個(gè)服務(wù)的顯示名稱)
      Optionname= Optionvalues:是選項(xiàng)名和選項(xiàng)的值。
      例如你要在開機(jī)是系統(tǒng)自動(dòng)加載themes服務(wù),你可以使用sc config themes start= auto,后面的start就是選項(xiàng),auto是選項(xiàng)的值。(注意=號(hào)后面有個(gè)空格,所有的使用選項(xiàng)的在=號(hào)后面都要加個(gè)空格再加上選項(xiàng)值)
    編輯本段SC命令的用法
      下面給出每個(gè)命令詳細(xì)的用法
      1、sc boot
      表明最近的啟動(dòng)是否應(yīng)該保存為上次已知的正確配置。
      語法
      Sc [ServerName] boot [{bad | OK}]
      參數(shù)
      ServerName:上面已經(jīng)介紹,在此不在累述(下同)
      [{bad | OK}]
      指定最近的啟動(dòng)是否錯(cuò)誤或它是否應(yīng)該保存為上次已知的正確啟動(dòng)配置。
      下面的示例顯示了如何使用 sc boot 命令:
      sc boot ok
      sc boot bad
      2、sc config
      修改注冊(cè)表和“服務(wù)控制管理器”數(shù)據(jù)庫中服務(wù)項(xiàng)目的值。
      語法
      Sc [ServerName] config [ServiceName] [type= {own | share | kernel | filesys | rec | adapt | interacttype= {own | share}}] [start= {boot | system | auto | demand | disabled}] [error= {normal | severe | critical | ignore}] [binpath= BinaryPathName] [group= LoadOrderGroup] [tag= {yes | no}] [depend= dependencies] [obj= {AccountName | ObjectName}] [displayname= DisplayName] [password= Password]
      ServiceName
      指定要操作的服務(wù)名。(上面也已經(jīng)介紹,下文不在累述)
      type= {own | share | kernel | filesys | rec | adapt | interacttype= {own | share}}
      指定服務(wù)類型。
      own
      服務(wù)以其自身的進(jìn)程運(yùn)行。不與其他服務(wù)共享可執(zhí)行文件。這是默認(rèn)值。
      share
      服務(wù)作為共享進(jìn)程運(yùn)行。與其他服務(wù)共享可執(zhí)行文件。
      kernel
      驅(qū)動(dòng)程序。
      filesys
      文件系統(tǒng)驅(qū)動(dòng)程序。
      rec
      文件系統(tǒng)識(shí)別驅(qū)動(dòng)程序(標(biāo)識(shí)計(jì)算機(jī)上使用的文件系統(tǒng))。
      adapt
      適配器驅(qū)動(dòng)程序(標(biāo)識(shí)鍵盤、鼠標(biāo)、磁盤驅(qū)動(dòng)器這樣的硬件項(xiàng))。
      interact
      服務(wù)可以與桌面交互,接收用戶的輸入。交互服務(wù)必須在 LocalSystem 帳戶下運(yùn)行。該類型必須與 type= own 或 type= shared(例如,type= interact type= own)結(jié)合使用。自身使用 type= interact 將會(huì)產(chǎn)生參數(shù)無效的錯(cuò)誤。
      start= {boot | system | auto | demand | disabled}
      指定服務(wù)的啟動(dòng)類型。
      boot
      由啟動(dòng)加載程序加載的設(shè)備驅(qū)動(dòng)程序。
      system
      在核心初始化過程中啟動(dòng)的設(shè)備驅(qū)動(dòng)程序。
      auto
      每次計(jì)算機(jī)重新啟動(dòng)時(shí)都會(huì)自動(dòng)啟動(dòng)、并且即使無人登錄到計(jì)算機(jī)也能正常運(yùn)行的服務(wù)。
      demand
      必須手動(dòng)啟動(dòng)的服務(wù)。如果沒有指定 start=,則此項(xiàng)即為默認(rèn)值。
      disabled
      不能啟動(dòng)的服務(wù)。要啟動(dòng)禁用的服務(wù),應(yīng)將啟動(dòng)類型更改為其他值。
      error= {normal | severe | critical | ignore}
      如果在啟動(dòng)過程中,服務(wù)啟動(dòng)失敗,則指定錯(cuò)誤的嚴(yán)重性。
      normal
      將記錄錯(cuò)誤,并且顯示消息對(duì)話框,通知用戶服務(wù)啟動(dòng)失敗。啟動(dòng)將繼續(xù)。這是默認(rèn)設(shè)置。
      severe
      記錄錯(cuò)誤(如果存在)。計(jì)算機(jī)嘗試以最新的有效配置重新啟動(dòng)。這可能導(dǎo)致計(jì)算機(jī)能夠重新啟動(dòng),但服務(wù)卻仍然無法運(yùn)行。
      critical
      記錄錯(cuò)誤(如果存在)。計(jì)算機(jī)嘗試以最新的有效配置重新啟動(dòng)。如果上次已知正確的配置失敗,啟動(dòng)也將失敗,啟動(dòng)進(jìn)程將以停止錯(cuò)誤而中止。
      ignore
      錯(cuò)誤已記錄,啟動(dòng)繼續(xù)。記錄錯(cuò)誤超出在事件ri志的范圍,不再給用戶作出提示。
      binpath= BinaryPathName
      指定指向服務(wù)二進(jìn)制文件的路徑。
      group= LoadOrderGroup
      指定該服務(wù)所屬組的名稱。組列表存儲(chǔ)在注冊(cè)表的 HKLM\System\CurrentControlSet\Control\ServiceGroupOrder 子項(xiàng)中。默認(rèn)設(shè)置為空值。
      tag= {yes | no}
      指定是否在 CreateService 調(diào)用中獲得 TagID。標(biāo)記僅用于引導(dǎo)啟動(dòng)或系統(tǒng)啟動(dòng)驅(qū)動(dòng)程序。
      depend= dependencies
      指定必須在此項(xiàng)服務(wù)之前啟動(dòng)的服務(wù)或組的名稱。名稱以正斜杠 (/) 分隔。
      obj= {AccountName | ObjectName}
      指定運(yùn)行服務(wù)將使用的帳戶名,或指定運(yùn)行驅(qū)動(dòng)程序?qū)⑹褂玫?Windows 驅(qū)動(dòng)程序?qū)ο竺DJ(rèn)設(shè)置為 LocalSystem。
      displayname= DisplayName
      指定一個(gè)可以在用戶界面程序中用于為用戶標(biāo)識(shí)服務(wù)的友好的、有意義的名稱。例如,一項(xiàng)服務(wù)的子項(xiàng)名是對(duì)用戶毫無意義的 wuauserv,而顯示的名稱是“自動(dòng)更新”。
      password= Password
      指定一個(gè)密碼。如果使用了非 LocalSystem 的帳戶,則此項(xiàng)是必需的。
      備注
      如果參數(shù)及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會(huì)失敗。
      示例
      下面的示例顯示了如何使用 sc config 命令:
      sc config NewService binpath= "ntsd -d c:\windows\system32\NewServ.exe"
      3、sc continue
      為了恢復(fù)暫停的服務(wù),要給服務(wù)發(fā)送一個(gè) CONTINUE 控制請(qǐng)求。
      語法
      Sc [ServerName] continue [ServiceName]
      參數(shù)
      ServerName:略
      ServiceName:略
      備注
      使用 continue 操作來恢復(fù)暫停的服務(wù)。
      下面的示例顯示了如何使用 sc continue 命令:
      sc continue tapisrv
      4、sc control
      向服務(wù)發(fā)送 CONTROL 。
      語法
      sc [ServerName] control [ServiceName] [{paramchange | netbindadd | netbindremove | netbindenable | netbinddisable | UserDefinedControlB}]
      參數(shù)
      {paramchange | netbindadd | netbindremove | netbindenable | netbinddisable | UserDefinedControlB}
      指定要發(fā)送到服務(wù)的控制。
      5、sc create
      在注冊(cè)表和“服務(wù)控制管理器”中為服務(wù)創(chuàng)建子項(xiàng)和項(xiàng)目。
      語法
      Sc [ServerName] create [ServiceName] [type= {own | share | kernel | filesys | rec | adapt | interacttype= {own | share}}] [start= {boot | system | auto | demand | disabled}] [error= {normal | severe | critical | ignore}] [binpath= BinaryPathName] [group= LoadOrderGroup] [tag= {yes | no}] [depend= dependencies] [obj= {AccountName | ObjectName}] [displayname= DisplayName] [password= Password]
      參數(shù):各個(gè)參數(shù)的作用參見sc config 命令
      下面的示例顯示了如何使用 sc create 命令:
      sc \\myserver create NewService binpath= c:\windows\system32\NewServ.exe
      sc create NewService binpath= c:\windows\system32\NewServ.exe type= share start= auto depend= "+TDI Netbios"
      6、sc delete
      從注冊(cè)表中刪除服務(wù)子項(xiàng)。如果服務(wù)正在運(yùn)行或者另一個(gè)進(jìn)程有一個(gè)該服務(wù)的打開句柄,那么此服務(wù)將標(biāo)記為刪除。
      語法
      Sc [ServerName] delete [ServiceName]
      參數(shù):略
      備注
      使用“添加或刪除程序”刪除 DHCP、DNS 或任何其他內(nèi)置的操作系統(tǒng)服務(wù)。“添加或刪除程序”不僅會(huì)刪除該服務(wù)的注冊(cè)表子項(xiàng),而且還會(huì)卸載該服務(wù)并刪除其所有的快捷方式。
      下面的示例顯示了如何使用 sc delete 命令:
      sc delete newserv
      7、sc descrīption
      設(shè)置服務(wù)的描述字符串。
      語法
      Sc [ServerName] descrīption [ServiceName] [Descrīption]
      參數(shù):略
      描述
      為指定服務(wù)指定描述。這個(gè)描述的內(nèi)容可以在控制面板-管理工具-服務(wù)里通過查看該服務(wù)的屬性看到。如果沒有指定字符串,則不會(huì)修改該服務(wù)的描述。不限制服務(wù)描述中可包含的字符數(shù)。
      示例
      下面的示例顯示了如何使用 sc descrīption 命令:
      sc descrīption newserv "Runs quality of service control."
      8、sc enumdepend
      枚舉依賴此服務(wù)的系統(tǒng)組件,這也可以從控制面板-管理工具-服務(wù)里通過查看該服務(wù)的屬性中的依存關(guān)系選項(xiàng)卡看到(“下面的系統(tǒng)組件依賴此服務(wù)”下面的部分)
      語法
      Sc [ServerName] enumdepend [ServiceName] [BufferSize]
      參數(shù)
      BufferSize
      以字節(jié)為單位指定枚舉緩沖區(qū)的大小。默認(rèn)值為 1024 字節(jié)。
      備注
      如果緩沖區(qū)不夠大,enumdepend 操作只會(huì)部分輸出依存關(guān)系,并指定輸出所有依存關(guān)系所需的額外緩沖區(qū)大小。如果輸出被截?cái)啵?qǐng)重新運(yùn)行該操作并指定更大的緩沖區(qū)大小。
      下面的示例顯示了如何使用 sc enumdepend 命令:
      sc enumdepend rpcss 5690
      sc enumdepend tapisrv
      9、sc failure
      指定服務(wù)失敗時(shí)要采取的措施。
      語法
      Sc [ServerName] failure [ServiceName] [reset= ErrorFreePeriod] [reboot= BroadcastMessage] [command= CommandLine] [actions= FailureActionsAndDelayTime]
      參數(shù)
      reset= ErrorFreePeriod
      指定沒有失敗的周期長度(單位為秒),此后失敗計(jì)數(shù)應(yīng)該重置為 0。這個(gè)參數(shù)必須與 actions= 參數(shù)結(jié)合使用。
      reboot= BroadcastMessage
      指定服務(wù)失敗時(shí)要廣播的消息。
      command= CommandLine
      指定服務(wù)失敗時(shí)要運(yùn)行的命令行。有關(guān)在失敗時(shí)如何運(yùn)行批處理或 VBS 文件的詳細(xì)信息,請(qǐng)參閱“注釋”。
      actions= FailureActionsAndDelayTime
      指定失敗操作及其延遲時(shí)間(單位為毫秒),以正斜杠 (/) 隔開。以下操作均有效:run、restart 和 reboot。此參數(shù)必須與 reset= 參數(shù)結(jié)合使用。失敗后不采取任何操作時(shí),請(qǐng)使用 actions= ""。
      備注
      并非所有服務(wù)都允許更改其失敗選項(xiàng)。其中一些作為服務(wù)集的一部分運(yùn)行。
      要在失敗時(shí)運(yùn)行批處理文件,請(qǐng)指定 cmd.exeDrive:\FileName.bat 為 command= 參數(shù),其中 Drive:\FileName.bat 是批處理文件的完全合格的名稱。
      要在失敗時(shí)運(yùn)行 VBS 文件,請(qǐng)指定 cscrīpt drive:\myscrīpt.vbs 為 command= 參數(shù),其中 Drive:\myscrīpt.vbs 是腳本文件完全合格的名稱。
      可以將三種不同的操作指定為 actions= 參數(shù),它們將會(huì)在服務(wù)的第一次、第二次、第三次失敗時(shí)使用。
      如果參數(shù)及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會(huì)失敗。
      下面的示例顯示了如何使用 sc failure 命令:
      sc failure msftpsvc reset= 30 actions= restart/5000
      sc failure dfs reset= 60 command= c:\windows\services\restart_dfs.exe actions= run/5000
      sc failure dfs reset= 60 actions= reboot/30000
      sc failure dfs reset= 60 reboot= "The Distributed File System service has failed.Because of this, the computer will reboot in 30 seconds." actions= reboot/30000
      sc failure myservice reset= 3600 reboot= "MyService crashed -- rebooting machine" command= "%windir%\MyServiceRecovery.exe" actions= restart/5000/run/10000/reboot/60000
      10、sc getdisplayname
      獲得與特定服務(wù)關(guān)聯(lián)的顯示名稱。
      語法
      Sc [ServerName] getdisplayname [ServiceName] [BufferSize]
      參數(shù)
      BufferSize
      指定緩沖區(qū)大小(以字節(jié)為單位)。默認(rèn)值為 1024 字節(jié)。
      下面的示例顯示了如何使用 sc getdisplayname 命令:
      sc getdisplayname clipsrv
      sc getdisplayname tapisrv
      sc getdisplayname sharedaccess
      11、sc getkeyname
      使用特定服務(wù)的顯示名稱作為輸入的內(nèi)容會(huì)獲得與其相關(guān)聯(lián)的項(xiàng)名。
      語法
      sc [ServerName] getkeyname [ServiceDisplayName] [BufferSize]
      參數(shù)
      ServiceDisplayName
      指定服務(wù)的顯示名稱。
      BufferSize
      指定緩沖區(qū)大小(以字節(jié)為單位)。默認(rèn)值為 1024 字節(jié)。
      備注
      如果 ServiceDisplayName 包含空格,請(qǐng)使用引號(hào)將文本引起來(例如,"Service Display Name")。
      下面的示例顯示了如何使用 sc getkeyname 命令:
      sc getkeyname "remote procedure call (rpc)"
      sc getkeyname "internet connection sharing"
      sc getkeyname clipbook
      12、sc interrogate
      向服務(wù)發(fā)送一個(gè) INTERROGATE 控制請(qǐng)求。
      語法
      Sc [ServerName] interrogate [ServiceName]
      參數(shù):略
      備注
      向服務(wù)發(fā)送 INTERROGATE 會(huì)導(dǎo)致該服務(wù)使用“服務(wù)控制管理器”更新其狀態(tài)。
      下面的示例顯示了如何使用 sc interrogate 命令:
      sc interrogate sharedaccess
      sc interrogate rpcss
      13、sc lock
      鎖定“服務(wù)控制管理器”的數(shù)據(jù)庫。
      語法
      sc [ServerName] lock
      參數(shù):略
      備注
      鎖定“服務(wù)控制管理器”的數(shù)據(jù)庫會(huì)阻止啟動(dòng)任何服務(wù)。如果要確保服務(wù)在停止之后不會(huì)啟動(dòng),請(qǐng)使用這個(gè)命令。這可以使您不受干擾地進(jìn)行一些操作(例如,刪除服務(wù))。
      使用 lock 操作鎖定“服務(wù)控制管理器”的數(shù)據(jù)庫,然后通過鍵入 u 來使數(shù)據(jù)庫解鎖。也可停止鎖定數(shù)據(jù)庫的進(jìn)程。
      下面的示例顯示了如何使用 sc lock 命令:
      sc lock
      14、sc pause
      向服務(wù)發(fā)送 PAUSE 控制請(qǐng)求。
      語法
      Sc [ServerName] pause [ServiceName]
      參數(shù):略
      備注
      在終止服務(wù)之前使用 pause 操作來暫停它。
      并非所有服務(wù)都能夠被暫停。
      在暫停時(shí)并非所有服務(wù)都執(zhí)行同樣的操作。一些服務(wù)繼續(xù)為現(xiàn)有客戶端服務(wù),但拒絕接受新的客戶端。其他的會(huì)終止對(duì)現(xiàn)有客戶端的服務(wù),同時(shí)也會(huì)拒絕接受新的客戶端。
      下面的示例顯示了如何使用 sc pause 命令:
      sc pause tapisrv
      15、sc qc
      查詢服務(wù)的配置信息。
      語法
      Sc [ServerName] qc [ServiceName] [BufferSize]
      參數(shù)
      BufferSize
      指定緩沖區(qū)大小(以字節(jié)為單位)。默認(rèn)值為 1024 字節(jié)。
      備注
      qc 操作可以顯示有關(guān)服務(wù)的下列信息:
      SERVICE_NAME(服務(wù)的注冊(cè)表子項(xiàng)名稱)、TYPE、ERROR_CONTROL、BINARY_PATH_NAME、LOAD_ORDER_GROUP、TAG、DISPLAY_NAME、DEPENDENCIES 和 SERVICE_START_NAME。
      管理員可以使用 SC 來確定任一服務(wù)的二進(jìn)制名稱,并查明它是否與其他服務(wù)共享一個(gè)進(jìn)程,在命令行下鍵入下列命令:
      sc qc ServiceName
      SC 有助于將 Microsoft 管理控制臺(tái) (MMC) 的服務(wù)節(jié)點(diǎn)中的服務(wù)與“系統(tǒng)監(jiān)視器”中的進(jìn)程進(jìn)行匹配。如果二進(jìn)制名稱是 Services.exe,那么服務(wù)共享“服務(wù)控制器”進(jìn)程。
      Services.exe 啟動(dòng)所有的服務(wù)。為節(jié)約系統(tǒng)資源,幾個(gè)為 Windows 開發(fā)的 Win32 服務(wù)被編寫為共享 Services.exe 進(jìn)程。這些服務(wù)不作為獨(dú)立的進(jìn)程列在“系統(tǒng)監(jiān)視器”或“任務(wù)管理器”之中。Svchost.exe 也是如此,它是許多操作服務(wù)共享的服務(wù)主機(jī)進(jìn)程。
      因?yàn)榈谌?Win32 服務(wù)也可以配置為共享進(jìn)程,所以不可能為每一個(gè) Win32 服務(wù)創(chuàng)建一個(gè)進(jìn)程。SC 可以用來獲得這些服務(wù)的配置信息。但是,如果一項(xiàng)服務(wù)不與其他服務(wù)共享其進(jìn)程,那么在服務(wù)運(yùn)行時(shí),“系統(tǒng)監(jiān)視器”中會(huì)出現(xiàn)其進(jìn)程。
      因?yàn)?SC 與包含在 Windows 中的 Services.exe 相比,提供了有關(guān)服務(wù)的更為詳細(xì)和準(zhǔn)確的信息,所以對(duì)于服務(wù)開發(fā)人員來說,SC 更有用處。Services.exe 可以確定服務(wù)是正在運(yùn)行、已停止還是已暫停。盡管這些工具對(duì)于正在平穩(wěn)運(yùn)行的已調(diào)試應(yīng)用程序已經(jīng)足夠,但它們提供的有關(guān)正開發(fā)的服務(wù)的信息卻會(huì)使人誤解。例如,正在啟動(dòng)的服務(wù)不管其實(shí)際運(yùn)行與否都顯示為已啟動(dòng)。
      SC 可執(zhí)行對(duì)所有 Windows 服務(wù)控制應(yīng)用編程接口 (API) 函數(shù)的調(diào)用。通過在命令行下指定這些函數(shù)來設(shè)置其參數(shù)。
      使用 SC,可以查詢服務(wù)狀態(tài),檢索存儲(chǔ)在狀態(tài)結(jié)構(gòu)字段中的值。Services.exe 不能提供服務(wù)的完整狀態(tài),但 SC 可以顯示精確的服務(wù)狀態(tài),以及最新的檢查點(diǎn)號(hào)碼和等待提示。可以將檢查點(diǎn)用作調(diào)試工具,原因在于它表明了在程序停止響應(yīng)之前初始化進(jìn)行的程度。SC 也可以用來指定遠(yuǎn)程計(jì)算機(jī)名,以便于在遠(yuǎn)程計(jì)算機(jī)上調(diào)用服務(wù) API 函數(shù)或查看服務(wù)狀態(tài)結(jié)構(gòu)。
      下面的示例顯示了如何使用 sc qc 命令:
      sc qc \\myserver newsrvice
      sc qc rpcss 248
      16、sc qdescrīption
      顯示服務(wù)的描述字符串。
      語法
      Sc [ServerName] qdescrīption [ServiceName] [BufferSize]
      參數(shù)
      BufferSize
      指定緩沖區(qū)大小(以字節(jié)為單位)。默認(rèn)值為 1024 字節(jié)。
      下面的示例顯示了如何使用 sc qdescrīption 命令:
      sc qdescrīption rpcss
      sc qdescrīption rpcss 138
      17、sc qfailure
      顯示指定服務(wù)失敗時(shí)要執(zhí)行的操作。
      語法
      Sc [ServerName] qfailure [ServiceName] [BufferSize]
      參數(shù)
      BufferSize
      指定緩沖區(qū)大小(以字節(jié)為單位)。默認(rèn)值為 1024 字節(jié)。
      備注
      qfailure 操作可以顯示有關(guān)服務(wù)的下列信息:SERVICE_NAME(服務(wù)的注冊(cè)表子項(xiàng)名)、RESET_PERIOD、REBOOT_MESSAGE、COMMAND_LINE 和 FAILURE_ACTIONS。
      下面的示例顯示了如何使用 sc qfailure 命令:
      sc qfailure rpcss
      sc qfailure rpcss 20
      18、sc query
      獲得和顯示關(guān)于指定的服務(wù)、驅(qū)動(dòng)程序、服務(wù)類型或驅(qū)動(dòng)程序類型的信息。
      語法
      Sc [ServerName] query [ServiceName] [type= {driver | service | all}] [type= {own | share | interact | kernel | filesys | rec | adapt}] [state= {active | inactive | all}] [bufsize= BufferSize] [ri= ResumeIndex] [group= GroupName]
      參數(shù)
      ServiceName
      指定由 getkeyname 操作返回的服務(wù)名。此 query 參數(shù)不與其他的 query 參數(shù)結(jié)合使用(除了 ServerName)。
      type= {driver | service | all}
      指定需要枚舉的內(nèi)容。默認(rèn)類型為 service。
      driver
      指定僅枚舉驅(qū)動(dòng)程序。
      service
      指定僅枚舉服務(wù)。
      all
      指定同時(shí)枚舉驅(qū)動(dòng)程序和服務(wù)。
      type= {own | share | interact | kernel | filesys | rec | adapt}
      指定要枚舉的服務(wù)類型或驅(qū)動(dòng)程序類型。
      own
      服務(wù)以其自身的進(jìn)程運(yùn)行。不與其他服務(wù)共享可執(zhí)行文件。這是默認(rèn)值。
      share
      服務(wù)作為共享進(jìn)程運(yùn)行。與其他服務(wù)共享可執(zhí)行文件。
      interact
      服務(wù)可以與桌面交互,接收用戶的輸入。交互服務(wù)必須在 LocalSystem 帳戶下運(yùn)行。
      kernel
      驅(qū)動(dòng)程序。
      filesys
      文件系統(tǒng)驅(qū)動(dòng)程序。
      state= {active | inactive | all}
      指定要枚舉的服務(wù)的已開始狀態(tài)。默認(rèn)狀態(tài)是 active。
      active
      指定所有的活動(dòng)服務(wù)。
      inactive
      指定所有暫停或停止的服務(wù)。
      all
      指定所有服務(wù)。
      bufsize= BufferSize
      以字節(jié)為單位指定枚舉緩沖區(qū)的大小。默認(rèn)大小為 1024 字節(jié)。當(dāng)從查詢返回的顯示結(jié)果超過 1024 個(gè)字節(jié)時(shí),增加枚舉緩沖區(qū)的大小。
      ri= ResumeIndex
      指定開始或繼續(xù)枚舉的索引號(hào)。默認(rèn)值為 0。 在查詢返回的信息超過默認(rèn)緩沖區(qū)能夠顯示的大小時(shí),請(qǐng)與 bufsize= 參數(shù)結(jié)合使用這個(gè)參數(shù)。
      group= GroupName
      指定要枚舉的服務(wù)組。默認(rèn)設(shè)置為所有組。
      備注
      如果參數(shù)及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會(huì)失敗。
      query 操作可以顯示有關(guān)服務(wù)的下列信息:SERVICE_NAME(服務(wù)的注冊(cè)表子項(xiàng)名)、TYPE、STATE(以及不可用的狀態(tài))、WIN32_EXIT_B、SERVICE_EXIT_B、CHECKPOINT 和 WAIT_HINT。
      在某些情況下,type= 參數(shù)可以使用兩次。type= 參數(shù)的第一次出現(xiàn)指定是否查詢服務(wù)、驅(qū)動(dòng)器或所有這些項(xiàng)。type= 參數(shù)的第二次出現(xiàn)指定一個(gè)由 create 操作進(jìn)一步縮小查詢范圍的類型。
      當(dāng) query 命令的顯示結(jié)果超過了枚舉緩沖區(qū)的大小時(shí),顯示類似于以下內(nèi)容的消息:
      Enum: more data, need 1822 bytes start resume at index 79
      要顯示剩余的 query 信息,請(qǐng)重新運(yùn)行 query,將 bufsize= 設(shè)置為所需的字節(jié)數(shù),并將 ri= 設(shè)置為指定的索引。例如,在命令行鍵入下面的指令會(huì)顯示剩余的輸出:
      sc query bufsize= 1822 ri= 79
      下面的示例顯示了如何使用 sc query 命令:
      sc query
      sc query messenger
      sc query type= driver
      sc query type= service
      sc query state= all
      sc query bufsize= 50
      sc query ri= 14
      sc query type= service type= interact
      sc query type= driver group= ndis
      19、sc queryex
      獲得和顯示關(guān)于指定的服務(wù)、驅(qū)動(dòng)程序、服務(wù)類型或驅(qū)動(dòng)程序類型的擴(kuò)展信息。
      語法
      Sc [ServerName] queryex [type= {driver | service | all}] [type= {own | share | interact | kernel | filesys | rec | adapt}] [state= {active | inactive | all}] [bufsize= BufferSize] [ri= ResumeIndex][group= GroupName]
      參數(shù)
      ServiceName
      指定由 getkeyname 操作返回的服務(wù)名。此 queryex 參數(shù)不與 ServerName 之外的任何其他 queryex 參數(shù)結(jié)合使用。
      type= {driver | service | all}
      指定需要枚舉的內(nèi)容。默認(rèn)類型為 service。
      driver
      指定僅枚舉驅(qū)動(dòng)程序。
      service
      指定僅枚舉服務(wù)。
      all
      指定同時(shí)枚舉驅(qū)動(dòng)程序和服務(wù)。
      type= {own | share | interact | kernel | filesys | rec | adapt}
      指定要枚舉的服務(wù)類型或驅(qū)動(dòng)程序類型。
      own
      服務(wù)以其自身的進(jìn)程運(yùn)行。不與其他服務(wù)共享可執(zhí)行文件。這是默認(rèn)值。
      share
      服務(wù)作為共享進(jìn)程運(yùn)行。與其他服務(wù)共享可執(zhí)行文件。
      interact
      服務(wù)可以與桌面交互,接收用戶的輸入。交互服務(wù)必須在 LocalSystem 帳戶下運(yùn)行。
      kernel
      驅(qū)動(dòng)程序。
      filesys
      文件系統(tǒng)驅(qū)動(dòng)程序。
      state= {active | inactive | all}
      指定要枚舉的服務(wù)的已開始狀態(tài)。默認(rèn)狀態(tài)是 active。
      active
      指定所有的活動(dòng)服務(wù)。
      inactive
      指定所有暫停或停止的服務(wù)。
      all
      指定所有服務(wù)。
      bufsize= BufferSize
      以字節(jié)為單位指定枚舉緩沖區(qū)的大小。默認(rèn)大小為 1024 字節(jié)。
      ri= ResumeIndex
      指定開始或繼續(xù)枚舉的索引號(hào)。默認(rèn)值為 0。
      group= GroupName
      指定要枚舉的服務(wù)組。默認(rèn)設(shè)置為所有組。
      備注
      如果參數(shù)及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會(huì)失敗。
      queryex 操作可以顯示有關(guān)服務(wù)的下列信息:SERVICE_NAME(服務(wù)的注冊(cè)表子項(xiàng)名)、TYPE、STATE(以及不可用的狀態(tài))、WIN32_EXIT_B、SERVICE_EXIT_B、CHECKPOINT、WAIT_HINT、PID 和 FLAGS。
      在某些情況下,type= 參數(shù)可以使用兩次。type= 參數(shù)的第一次出現(xiàn)指定是否查詢服務(wù)、驅(qū)動(dòng)器或所有這些項(xiàng)。type= 參數(shù)的第二次出現(xiàn)指定一個(gè)由 create 操作進(jìn)一步縮小查詢范圍的類型。
      當(dāng) queryex 命令的顯示結(jié)果超過了枚舉緩沖區(qū)的大小時(shí),顯示類似于以下內(nèi)容的消息:
      Enum: more data, need 2130 bytes start resume at index 75
      要顯示剩余的 queryex 信息,請(qǐng)重新運(yùn)行 queryex,將 bufsize= 設(shè)置為所需的字節(jié)數(shù),并將 ri= 設(shè)置為指定的索引。例如,在命令行鍵入下面的指令會(huì)顯示剩余的輸出:
      sc queryex bufsize= 2130 ri= 75
      下面的示例顯示了如何使用 sc queryex 命令:
      sc queryex messenger
      sc queryex group= ""
      20、sc querylock
      查詢和顯示“服務(wù)控制管理器”數(shù)據(jù)庫的鎖定信息。
      語法
      Sc [ServerName] querylock
      參數(shù):略
      21、sc sdset
      使用“服務(wù)描述符定義語言 (SDDL)”來設(shè)置服務(wù)的安全描述符。
      語法
      Sc [ServerName] sdset ServiceName ServiceSecurityDescrīptor
      參數(shù)
      ServiceSecurityDescrīptor
      在 SDDL 中指定服務(wù)描述符。
      備注
      有關(guān) SDDL 的詳細(xì)信息,請(qǐng)參閱 Microsoft 網(wǎng)站上的 Security Descrīptor Definition Language(安全描述符定義語言)。
      22、sc sdshow
      使用 SDDL 顯示服務(wù)的安全描述符。
      語法
      Sc [ServerName] sdshow ServiceName
      參數(shù):略
      備注
      有關(guān) SDDL 的詳細(xì)信息,請(qǐng)參閱 Microsoft 網(wǎng)站上的 Security Descrīptor Definition Language(安全描述符定義語言)。
      示例
      sc sdshow rpcss
      23、sc start
      啟動(dòng)正在運(yùn)行的服務(wù)。
      語法
      Sc [ServerName] start ServiceName [ServiceArguments]
      參數(shù)
      ServiceArguments
      指定傳遞給要啟動(dòng)的服務(wù)的服務(wù)參數(shù)。
      下面的示例顯示了如何使用 sc start 命令:
      sc start tapisrv
      24、sc stop
      向服務(wù)發(fā)送 STOP 控制請(qǐng)求。
      語法
      Sc [ServerName] stop ServiceName
      參數(shù):略
      備注
      并非所有服務(wù)都能夠被停止。
      下面的示例顯示了如何使用 sc stop 命令:
      sc stop tapisrv
    posted @ 2008-10-15 09:46 小馬歌 閱讀(295) | 評(píng)論 (0)編輯 收藏
     

    SC命令是XP系統(tǒng)中功能強(qiáng)大的DOS命令,SC命令能與“服務(wù)控制器”和已安裝設(shè)備進(jìn)行通訊。
    安裝服務(wù):sc create serviceName binPath= "D:\server.exe"        [注意binPath= 之后有一個(gè)空格,必須有]

    卸載服務(wù):sc delete serviceName

    or check HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices

    以上修改要重起機(jī)器才能生效

    另:
    啟動(dòng)服務(wù):net start serviceName 或sc start serviceName
    停止服務(wù):net stop serviceName 或sc stop serviceName

    [SC命令 的參數(shù)可以配置指定的服務(wù),檢索當(dāng)前服務(wù)的狀態(tài),也可以停止和啟動(dòng)服務(wù)(功能上類似NET STOP/START命令,但SC速度更快且能停止更多的服務(wù))。]

    posted @ 2008-10-15 09:39 小馬歌 閱讀(648) | 評(píng)論 (0)編輯 收藏
     
       到 深圳周邊城市 坐汽車比較方便,提供個(gè)查詢地址:
    http://jt.sz.bendibao.com/keche/search.asp 
    posted @ 2008-10-13 12:14 小馬歌 閱讀(244) | 評(píng)論 (0)編輯 收藏
     
    估計(jì)是查看了qq的相關(guān)信息,自動(dòng)創(chuàng)建的,地址:http://xiaomage234.woku.com

    這種方式蠻新奇的
    posted @ 2008-10-07 14:28 小馬歌 閱讀(104) | 評(píng)論 (0)編輯 收藏
     
    說是,小三必修課
        
        其實(shí),是所有情場(chǎng)中人的扒皮戲。
        
        《畫皮》是一個(gè)驚喜,有些是無心,有些是故意。
        
        因?yàn)閼蚵诽屏迹覀兛偸侨滩蛔⌒?chǎng)。
        
        然而,面對(duì),那些太刻意的真情告白……我們?nèi)绻恍Γy道要跟著哭嗎?
        
        這場(chǎng)戲,需要些時(shí)間沉淀,然后,就有人像我們回憶八十年代的港片一樣來回憶這張《畫皮》。
        
        不如把笑點(diǎn)抖一抖,順便幫著大家扭曲一下邏輯。
        
        這個(gè)故事告訴我們生活中的許多大道理。
        
        故事的基本結(jié)構(gòu)是這樣的。
        
        
        
        陳坤和甄子丹本來是戰(zhàn)友,兩個(gè)人都喜歡趙薇。趙薇選擇了嫁給陳坤,甄子丹憤而遠(yuǎn)走。
        畫皮定律一:再好的朋友,搶一個(gè)心上人,也會(huì)翻臉。無論男女。
        
        陳坤救了一個(gè)女人周迅回家。周迅其實(shí)是妖怪。
        畫皮定律二:如果一個(gè)有家的男人把一個(gè)單身女子帶回家,這絕對(duì)是場(chǎng)冒險(xiǎn),不管這個(gè)姑娘會(huì)不會(huì)畫皮。
        
        趙薇懷疑陳坤喜歡周迅,進(jìn)而發(fā)覺周迅來了之后,城里開始死人。認(rèn)準(zhǔn)周迅就是妖怪,
        畫皮定律三:如果一個(gè)女人發(fā)現(xiàn)自己的男人外面有了女人,那么到處跟人說那個(gè)女人是狐貍精,只能顯得自己像個(gè)瘋子,太小氣。
        
        
        但是沒有人相信她。她寫信喊來了甄子丹。
        畫皮定律四:還是去找自己的舊情人,是正路!(找舊情人來干什么,看你的興趣)
        
        
        周迅想嫁給陳坤,不是做妾,而是做夫人。
        畫皮定律五:如果一個(gè)小三,喜歡上了一個(gè)有婦之夫,又不像只是玩一玩就吃掉他,而是想要個(gè)名分,會(huì)搞得三個(gè)人都很凄慘。
        
        甄子丹來了,降魔者孫麗也來了,孫麗看著甄子丹很有感覺,甄子丹對(duì)孫麗也有點(diǎn)感覺。
        畫皮定律六:男人終究是要變心的,不管他當(dāng)初多么愛你,只不過是動(dòng)手沒動(dòng)手的差別,而且,總是有更年輕的姑娘出現(xiàn)的!!
        
        還有個(gè)蜥蜴精追隨周迅而來,蜥蜴精愛著狐貍精周迅,周迅不喜歡他。
        畫皮定律七:討厭長得不帥的男人,女人討厭“長舌頭”的男人,討厭知道自己當(dāng)年底細(xì)的男人,討厭,吃的東西,跟自己口味不同的男人……之后數(shù)條,都是第一條的借口。
        
        
        甄子丹表示自己相信趙薇,趙薇說甄子丹是個(gè)好人。
        畫皮定律八:如果一個(gè)人給你發(fā)了“好人卡”,基本來說,這個(gè)人打算送死你去,吃定你一輩子了。不知道逃的,是傻瓜。
        
        
        周迅想色誘陳坤,蜥蜴精吃醋,進(jìn)攻陳坤,大鬧府里。
        畫皮定律九:在兩個(gè)女人之間搖擺的男人,比較吃香。在兩個(gè)男人之間搖擺的女人,其實(shí)比較危險(xiǎn)。女人斗心計(jì),男人斗體力。
        
        
        蜥蜴精又進(jìn)攻趙薇,關(guān)鍵時(shí)刻,陳坤選擇去保護(hù)趙薇。
        畫皮定律十:所有的男人,都會(huì)先考慮自己的老婆的,小三們的悲哀…… 其實(shí),不是因?yàn)樗粗乩掀牛撬纳矸荽偈顾仨毾染茸约旱睦掀牛駝t,會(huì)被人說,沒有人味。
        
        周迅終于明白,陳坤更在乎身為老婆的趙薇。
        畫皮定律十一:情人早晚會(huì)發(fā)現(xiàn)真相的,這個(gè)時(shí)候,怎么選擇,能比較出一個(gè)人的智商。
        
        于是周迅直接脅迫趙薇離開,逼趙薇服毒。
        畫皮定律十二:偷情的樂趣,就在于偷偷摸摸,有人爭(zhēng)搶的感覺比較刺激,直接逼宮……注定是悲劇
        
        …………正邪開始大決戰(zhàn)!!
        
        
        
        所謂,凡事,不能十三點(diǎn)。那就到此為止吧。
        
        愛情這種事情,都不能仔細(xì)推敲,一推敲,就千瘡百孔。
      
      
       愛情經(jīng)不起推敲,幸福的是,你總是在某個(gè)時(shí)刻,還相信你會(huì)愛上,死心塌地
    posted @ 2008-10-06 14:38 小馬歌 閱讀(194) | 評(píng)論 (0)編輯 收藏
     
    鑒于rsa加密的重要性和相關(guān)源代碼的匱乏,經(jīng)過整理特此貼出。需要下載bcprov-jdk14-123.jar。
      
      import javax.crypto.Cipher;
      import java.security.*;
      import java.security.spec.RSAPublicKeySpec;
      import java.security.spec.RSAPrivateKeySpec;
      import java.security.spec.InvalidKeySpecException;
      import java.security.interfaces.RSAPrivateKey;
      import java.security.interfaces.RSAPublicKey;
      import java.io.*;
      import java.math.BigInteger;
      
      /**
      * RSA 工具類。提供加密,解密,生成密鑰對(duì)等方法。
      * 需要到http://www.bouncycastle.org下載bcprov-jdk14-123.jar。
      *
      */
      public class RSAUtil {
      
      /**
      * 生成密鑰對(duì)
      * @return KeyPair
      * @throws EncryptException
      */
      public static KeyPair generateKeyPair() throws EncryptException {
      try {
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",
      new org.bouncycastle.jce.provider.BouncyCastleProvider());
      final int KEY_SIZE = 1024;//沒什么好說的了,這個(gè)值關(guān)系到塊加密的大小,可以更改,但是不要太大,否則效率會(huì)低
      keyPairGen.initialize(KEY_SIZE, new SecureRandom());
      KeyPair keyPair = keyPairGen.genKeyPair();
      return keyPair;
      } catch (Exception e) {
      throw new EncryptException(e.getMessage());
      }
      }
      /**
      * 生成公鑰
      * @param modulus
      * @param publicExponent
      * @return RSAPublicKey
      * @throws EncryptException
      */
      public static RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent) throws EncryptException {
      KeyFactory keyFac = null;
      try {
      keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
      } catch (NoSuchAlgorithmException ex) {
      throw new EncryptException(ex.getMessage());
      }
      
      RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));
      try {
      return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);
      } catch (InvalidKeySpecException ex) {
      throw new EncryptException(ex.getMessage());
      }
      }
      /**
      * 生成私鑰
      * @param modulus
      * @param privateExponent
      * @return RSAPrivateKey
      * @throws EncryptException
      */
      public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) throws EncryptException {
      KeyFactory keyFac = null;
      try {
      keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
      } catch (NoSuchAlgorithmException ex) {
      throw new EncryptException(ex.getMessage());
      }
      
      RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent));
      try {
      return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);
      } catch (InvalidKeySpecException ex) {
      throw new EncryptException(ex.getMessage());
      }
      }
      /**
      * 加密
      * @param key 加密的密鑰
      * @param data 待加密的明文數(shù)據(jù)
      * @return 加密后的數(shù)據(jù)
      * @throws EncryptException
      */
      public static byte[] encrypt(Key key, byte[] data) throws EncryptException {
      try {
      Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
      cipher.init(Cipher.ENCRYPT_MODE, key);
      int blockSize = cipher.getBlockSize();//獲得加密塊大小,如:加密前數(shù)據(jù)為128個(gè)byte,而key_size=1024 加密塊大小為127 byte,加密后為128個(gè)byte;因此共有2個(gè)加密塊,第一個(gè)127 byte第二個(gè)為1個(gè)byte
      int outputSize = cipher.getOutputSize(data.length);//獲得加密塊加密后塊大小
      int leavedSize = data.length % blockSize;
      int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 : data.length / blockSize;
      byte[] raw = new byte[outputSize * blocksSize];
      int i = 0;
      while (data.length - i * blockSize > 0) {
      if (data.length - i * blockSize > blockSize)
      cipher.doFinal(data, i * blockSize, blockSize, raw, i * outputSize);
      else
      cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * outputSize);
      //這里面doUpdate方法不可用,查看源代碼后發(fā)現(xiàn)每次doUpdate后并沒有什么實(shí)際動(dòng)作除了把byte[]放到ByteArrayOutputStream中,而最后doFinal的時(shí)候才將所有的byte[]進(jìn)行加密,可是到了此時(shí)加密塊大小很可能已經(jīng)超出了OutputSize所以只好用dofinal方法。
      
      i++;
      }
      return raw;
      } catch (Exception e) {
      throw new EncryptException(e.getMessage());
      }
      }
      /**
      * 解密
      * @param key 解密的密鑰
      * @param raw 已經(jīng)加密的數(shù)據(jù)
      * @return 解密后的明文
      * @throws EncryptException
      */
      public static byte[] decrypt(Key key, byte[] raw) throws EncryptException {
      try {
      Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
      cipher.init(cipher.DECRYPT_MODE, key);
      int blockSize = cipher.getBlockSize();
      ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
      int j = 0;
      
      while (raw.length - j * blockSize > 0) {
      bout.write(cipher.doFinal(raw, j * blockSize, blockSize));
      j++;
      }
      return bout.toByteArray();
      } catch (Exception e) {
      throw new EncryptException(e.getMessage());
      }
      }
      /**
      *
      * @param args
      * @throws Exception
      */
      public static void main(String[] args) throws Exception {
      File file = new File("test.html");
      FileInputStream in = new FileInputStream(file);
      ByteArrayOutputStream bout = new ByteArrayOutputStream();
      byte[] tmpbuf = new byte[1024];
      int count = 0;
      while ((count = in.read(tmpbuf)) != -1) {
      bout.write(tmpbuf, 0, count);
      tmpbuf = new byte[1024];
      }
      in.close();
      byte[] orgData = bout.toByteArray();
      KeyPair keyPair = RSAUtil.generateKeyPair();
      RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
      RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();
      
      byte[] pubModBytes = pubKey.getModulus().toByteArray();
      byte[] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();
      byte[] priModBytes = priKey.getModulus().toByteArray();
      byte[] priPriExpBytes = priKey.getPrivateExponent().toByteArray();
      RSAPublicKey recoveryPubKey = RSAUtil.generateRSAPublicKey(pubModBytes,pubPubExpBytes);
      RSAPrivateKey recoveryPriKey = RSAUtil.generateRSAPrivateKey(priModBytes,priPriExpBytes);
      
      byte[] raw = RSAUtil.encrypt(priKey, orgData);
      file = new File("encrypt_result.dat");
      OutputStream out = new FileOutputStream(file);
      out.write(raw);
      out.close();
      byte[] data = RSAUtil.decrypt(recoveryPubKey, raw);
      file = new File("decrypt_result.html");
      out = new FileOutputStream(file);
      out.write(data);
      out.flush();
      out.close();
      }
      }
      
      加密可以用公鑰,解密用私鑰;或者加密用私鑰。通常非對(duì)稱加密是非常消耗資源的,因此可以對(duì)大數(shù)據(jù)用對(duì)稱加密如:des(具體代碼可以看我以前發(fā)的貼子),而對(duì)其對(duì)稱密鑰進(jìn)行非對(duì)稱加密,這樣既保證了數(shù)據(jù)的安全,還能保證效率。
    posted @ 2008-09-19 17:15 小馬歌 閱讀(284) | 評(píng)論 (0)編輯 收藏
     
    什么是RSA
      RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。
      RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學(xué)界多數(shù)人士?jī)A向于因子分解不是NPC問題。
      RSA的缺點(diǎn)主要有:A)產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密。B)分組長度太大,為保證安全性,n 至少也要 600 bits以上,使運(yùn)算代價(jià)很高,尤其是速度較慢,較對(duì)稱密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。目前,SET(Secure Electronic Transaction)協(xié)議中要求CA采用2048比特長的密鑰,其他實(shí)體使用1024比特的密鑰。
      這種算法1978年就出現(xiàn)了,它是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。
      RSA算法是一種非對(duì)稱密碼算法,所謂非對(duì)稱,就是指該算法需要一對(duì)密鑰,使用其中一個(gè)加密,則需要用另一個(gè)才能解密。
      RSA的算法涉及三個(gè)參數(shù),n、e1、e2。
      其中,n是兩個(gè)大質(zhì)數(shù)p、q的積,n的二進(jìn)制表示時(shí)所占用的位數(shù),就是所謂的密鑰長度。
      e1和e2是一對(duì)相關(guān)的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質(zhì);再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
      (n及e1),(n及e2)就是密鑰對(duì)。
      RSA加解密的算法完全相同,設(shè)A為明文,B為密文,則:A=B^e1 mod n;B=A^e2 mod n;
      e1和e2可以互換使用,即:
      A=B^e2 mod n;B=A^e1 mod n;
    一、RSA 的安全性
      RSA的安全性依賴于大數(shù)分解,但是否等同于大數(shù)分解一直未能得到理論上的證明,因?yàn)闆]有證明破解 RSA就一定需要作大數(shù)分解。假設(shè)存在一種無須分解大數(shù)的算法,那它肯定可以修改成為大數(shù)分解算法。目前, RSA 的一些變種算法已被證明等價(jià)于大數(shù)分解。不管怎樣,分解n是最顯然的攻擊方法。現(xiàn)在,人們已能分解多個(gè)十進(jìn)制位的大素?cái)?shù)。因此,模數(shù)n 必須選大一些,因具體適用情況而定。
    二、RSA的速度
      由于進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上倍,無論是軟件還是硬件實(shí)現(xiàn)。速度一直是RSA的缺陷。一般來說只用于少量數(shù)據(jù)加密。
    三、RSA的選擇密文攻擊
      RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝( Blind),讓擁有私鑰的實(shí)體簽署。然后,經(jīng)過計(jì)算就可得到它所想要的信息。實(shí)際上,攻擊利用的都是同一個(gè)弱點(diǎn),即存在這樣一個(gè)事實(shí):乘冪保留了輸入的乘法結(jié)構(gòu):
      ( XM )^d = X^d *M^d mod n
      前面已經(jīng)提到,這個(gè)固有的問題來自于公鑰密碼系統(tǒng)的最有用的特征--每個(gè)人都能使用公鑰。但從算法上無法解決這一問題,主要措施有兩條:一條是采用好的公鑰協(xié)議,保證工作過程中實(shí)體不對(duì)其他實(shí)體任意產(chǎn)生的信息解密,不對(duì)自己一無所知的信息簽名;另一條是決不對(duì)陌生人送來的隨機(jī)文檔簽名,簽名時(shí)首先使用One-Way HashFunction 對(duì)文檔作HASH處理,或
    四、RSA的公共模數(shù)攻擊
      若系統(tǒng)中共有一個(gè)模數(shù),只是不同的人擁有不同的e和d,系統(tǒng)將是危險(xiǎn)的。最普遍的情況是同一信息用不同的公鑰加密,這些公鑰共模而且互質(zhì),那末該信息無需私鑰就可得到恢復(fù)。設(shè)P為信息明文,兩個(gè)加密密鑰為e1和e2,公共模數(shù)是n,則:
      C1 = P^e1 mod n
      C2 = P^e2 mod n
      密碼分析者知道n、e1、e2、C1和C2,就能得到P。
      因?yàn)閑1和e2互質(zhì),故用Euclidean算法能找到r和s,滿足:
      r * e1 + s * e2 = 1
      假設(shè)r為負(fù)數(shù),需再用Euclidean算法計(jì)算C1^(-1),則
      ( C1^(-1) )^(-r) * C2^s = P mod n
      另外,還有其它幾種利用公共模數(shù)攻擊的方法。總之,如果知道給定模數(shù)的一對(duì)e和d,一是有利于攻擊者分解模數(shù),一是有利于攻擊者計(jì)算出其它成對(duì)的e’和d’,而無需分解模數(shù)。解決辦法只有一個(gè),那就是不要共享模數(shù)n。
      RSA的小指數(shù)攻擊。 有一種提高 RSA速度的建議是使公鑰e取較小的值,這樣會(huì)使加密變得易于實(shí)現(xiàn),速度有
      所提高。但這樣作是不安全的,對(duì)付辦法就是e和d都取較大的值。
      RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學(xué)界多數(shù)人士?jī)A向于因子分解不是NPC問題。 RSA的缺點(diǎn)主要有:A)產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密。B)分組長度太大,為保證安全性,n 至少也要 600 bits 以上,使運(yùn)算代價(jià)很高,尤其是速度較慢,較對(duì)稱密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。目前,SET( Secure Electronic Transaction )協(xié)議中要求CA采用比特長的密鑰,其他實(shí)體使用比特的密鑰。
    posted @ 2008-09-19 17:15 小馬歌 閱讀(239) | 評(píng)論 (0)編輯 收藏
     

    Java 程序中也有內(nèi)存漏洞?當(dāng)然有。與流行的觀念相反,在 Java 編程中,內(nèi)存治理仍然是需要考慮的問題。在本文中,您將了解到什么會(huì)導(dǎo)致內(nèi)存漏洞以及何時(shí)應(yīng)該關(guān)注這些漏洞。您還有機(jī)會(huì)實(shí)踐一下在您自己的項(xiàng)目中解決漏洞問題。
      
      Java 程序中的內(nèi)存漏洞是如何顯現(xiàn)出來的
      大多數(shù)程序員都知道,使用像 Java 這樣的編程語言的一大好處就是,他們不必再擔(dān)心內(nèi)存的分配和釋放問題。您只須創(chuàng)建對(duì)象,當(dāng)應(yīng)用程序不再需要這些對(duì)象時(shí),Java 會(huì)通過一種稱為“垃圾收集”的機(jī)制將這些對(duì)象刪除。這種處理意味著 Java 已經(jīng)解決了困擾其他編程語言的煩人問題 -- 可怕的內(nèi)存漏洞。是這樣的嗎?
      
      在深入討論之前,我們先回顧一下垃圾收集的工作方式。垃圾收集器的工作是發(fā)現(xiàn)應(yīng)用程序不再需要的對(duì)象,并在這些對(duì)象不再被訪問或引用時(shí)將它們刪除。垃圾收集器從根節(jié)點(diǎn)(在 Java 應(yīng)用程序的整個(gè)生存周期內(nèi)始終存在的那些類)開始,遍歷被引用的所有節(jié)點(diǎn)進(jìn)行清除。在它遍歷這些節(jié)點(diǎn)的同時(shí),它跟蹤哪些對(duì)象當(dāng)前正被引用著。任何類只要不再被引用,它就符合垃圾收集的條件。當(dāng)刪除這些對(duì)象以后,就可將它們所占用的內(nèi)存資源返回給 Java 虛擬機(jī) (JVM)。
      
      所以的確是這樣,Java 代碼不要求程序員負(fù)責(zé)內(nèi)存的治理和清除,它會(huì)自動(dòng)對(duì)無用的對(duì)象執(zhí)行垃圾收集。但是,要緊記的一點(diǎn)是 僅當(dāng)一個(gè)對(duì)象不再被引用時(shí)才會(huì)被統(tǒng)計(jì)為無用的。圖 1 說明了這個(gè)概念。
      
     

      
    圖 1. 無用但仍被引用的對(duì)象

      
      上面說明了在 Java 應(yīng)用程序執(zhí)行期間具有不同生存周期的兩個(gè)類。類 A 首先被實(shí)例化,并會(huì)在很長一段時(shí)間或程序的整個(gè)生存期內(nèi)存在。在某個(gè)時(shí)候,類 B 被創(chuàng)建,類 A 添加對(duì)這個(gè)新創(chuàng)建的類的一個(gè)引用。現(xiàn)在,我們假定類 B 是某個(gè)用戶界面小部件,它由用戶顯示甚至解除。假如沒有清除類 A 對(duì) B 的引用,則即便不再需要類 B,并且即便在執(zhí)行下一個(gè)垃圾收集周期以后,類 B 仍將存在并占用內(nèi)存空間。
      
      何時(shí)應(yīng)該關(guān)注內(nèi)存漏洞?
      假如您的程序在執(zhí)行一段時(shí)間以后發(fā)出 java.lang.OutOfMemoryError 錯(cuò)誤,則內(nèi)存漏洞肯定是一個(gè)重大嫌疑。除了這種明顯的情況之外,何時(shí)還應(yīng)該關(guān)注內(nèi)存漏洞呢?持完美主義觀點(diǎn)的程序員肯定會(huì)回答,應(yīng)該查找并糾正 所有內(nèi)存漏洞。但是,在得出這個(gè)結(jié)論之前,還有幾個(gè)方面需要考慮,包括程序的生存期和漏洞的大小。
      
      完全有這樣的可能,垃圾收集器在應(yīng)用程序的生存期內(nèi)可能始終不會(huì)運(yùn)行。不能保證 JVM 何時(shí)以及是否會(huì)調(diào)用垃圾收集器 -- 即便程序顯式地調(diào)用 System.gc() 也是如此。通常,在當(dāng)前的可用內(nèi)存能夠滿足程序的內(nèi)存需求時(shí),JVM 不會(huì)自動(dòng)運(yùn)行垃圾收集器。當(dāng)可用內(nèi)存不能滿足需求時(shí),JVM 將首先嘗試通過調(diào)用垃圾收集來釋放出更多的可用內(nèi)存。假如這種嘗試仍然不能釋放足夠的資源,JVM 將從操作系統(tǒng)獲取更多的內(nèi)存,直至達(dá)到答應(yīng)的最大極限。
      
      例如,考慮一個(gè)小型 Java 應(yīng)用程序,它顯示一些用于修改配置的簡(jiǎn)單用戶界面元素,并且它有一個(gè)內(nèi)存漏洞。很可能到應(yīng)用程序關(guān)閉時(shí)也不會(huì)調(diào)用垃圾收集器,因?yàn)?JVM 很可能有足夠的內(nèi)存來創(chuàng)建程序所需的全部對(duì)象,而此后可用內(nèi)存則所剩無幾。因此,在這種情況下,即使某些“死”對(duì)象在程序執(zhí)行時(shí)占用著內(nèi)存,它實(shí)際上并沒有什么用途。
      
      假如正在開發(fā)的 Java 代碼要全天 24 小時(shí)在服務(wù)器上運(yùn)行,則內(nèi)存漏洞在此處的影響就比在我們的配置實(shí)用程序中的影響要大得多。在要長時(shí)間運(yùn)行的某些代碼中,即使最小的漏洞也會(huì)導(dǎo)致 JVM 耗盡全部可用內(nèi)存。
      
      在相反的情況下,即便程序的生存期較短,假如存在分配大量臨時(shí)對(duì)象(或者若干吞噬大量?jī)?nèi)存的對(duì)象)的任何 Java 代碼,而且當(dāng)不再需要這些對(duì)象時(shí)也沒有取消對(duì)它們的引用,則仍然可能達(dá)到內(nèi)存極限。
      
      最后一種情況是內(nèi)存漏洞無關(guān)緊要。我們不應(yīng)該認(rèn)為 Java 內(nèi)存漏洞像其他語言(如 C++)中的漏洞那樣危險(xiǎn),在那些語言中內(nèi)存將丟失,且永遠(yuǎn)不會(huì)被返回給操作系統(tǒng)。在 Java 應(yīng)用程序中,我們使不需要的對(duì)象依附于操作系統(tǒng)為 JVM 所提供的內(nèi)存資源。所以從理論上講,一旦關(guān)閉 Java 應(yīng)用程序及其 JVM,所分配的全部?jī)?nèi)存將被返回給操作系統(tǒng)。
      
      確定應(yīng)用程序是否有內(nèi)存漏洞
      為了查看在 Windows NT 平臺(tái)上運(yùn)行的某個(gè) Java 應(yīng)用程序是否有內(nèi)存漏洞,您可能試圖在應(yīng)用程序運(yùn)行時(shí)觀察“任務(wù)治理器”中的內(nèi)存設(shè)置。但是,在觀察了運(yùn)行中的幾個(gè) Java 應(yīng)用程序以后,您會(huì)發(fā)現(xiàn)它們比本地應(yīng)用程序占用的內(nèi)存要多得多。我做過的一些 Java 項(xiàng)目要使用 10 到 20 MB 的系統(tǒng)內(nèi)存才能啟動(dòng)。而操作系統(tǒng)自帶的 Windows EXPlorer 程序只需 5 MB 左右的內(nèi)存。
      
      在 Java 應(yīng)用程序內(nèi)存使用方面應(yīng)注重的另一點(diǎn)是,這個(gè)典型程序在 IBM JDK 1.1.8 JVM 中運(yùn)行時(shí)占用的系統(tǒng)內(nèi)存越來越多。似乎直到為它分配非常多的物理內(nèi)存以后它才開始向系統(tǒng)返回內(nèi)存。這些情況是內(nèi)存漏洞的征兆嗎?
      
      要理解其中的緣由,我們必須熟悉 JVM 如何將系統(tǒng)內(nèi)存用作它的堆。當(dāng)運(yùn)行 java.exe 時(shí),您使用一定的選項(xiàng)來控制垃圾收集堆的起始大小和最大大小(分別用 -ms 和 -mx 表示)。Sun JDK 1.1.8 的默認(rèn)起始設(shè)置為 1 MB,默認(rèn)最大設(shè)置為 16 MB。IBM JDK 1.1.8 的默認(rèn)最大設(shè)置為系統(tǒng)總物理內(nèi)存大小的一半。這些內(nèi)存設(shè)置對(duì) JVM 在用盡內(nèi)存時(shí)所執(zhí)行的操作有直接影響。JVM 可能繼續(xù)增大堆,而不等待一個(gè)垃圾收集周期的完成。
      
      這樣,為了查找并最終消除內(nèi)存漏洞,我們需要使用比任務(wù)監(jiān)視實(shí)用程序更好的工具。當(dāng)您試圖調(diào)試內(nèi)存漏洞時(shí),內(nèi)存調(diào)試程序(請(qǐng)參閱參考資源)可能派得上用場(chǎng)。這些程序通常會(huì)顯示堆中的對(duì)象數(shù)、每個(gè)對(duì)象的實(shí)例數(shù)和這些對(duì)象所占用的內(nèi)存等信息。此外,它們也可能提供有用的視圖,這些視圖可以顯示每個(gè)對(duì)象的引用和引用者,以便您跟蹤內(nèi)存漏洞的來源。
      
      下面我將說明我是如何用 Sitraka Software 的 JProbedebugger 檢測(cè)和去除內(nèi)存漏洞的,以使您對(duì)這些工具的部署方式以及成功去除漏洞所需的過程有所了解。
      
      內(nèi)存漏洞的一個(gè)示例
      本例集中討論一個(gè)問題,我們部門當(dāng)時(shí)正在開發(fā)一個(gè)商業(yè)發(fā)行版軟件,這是一個(gè) Java JDK 1.1.8 應(yīng)用程序,一個(gè)測(cè)試人員花了幾個(gè)小時(shí)研究這個(gè)程序才最終使這個(gè)問題顯現(xiàn)出來。這個(gè) Java 應(yīng)用程序的基本代碼和包是由幾個(gè)不同的開發(fā)小組在不同的時(shí)間開發(fā)的。我猜想,該應(yīng)用程序中意外出現(xiàn)的內(nèi)存漏洞是由那些沒有真正理解別人開發(fā)的代碼的程序員造成的。
      
      我們正在討論的 Java 代碼答應(yīng)用戶為 Palm 個(gè)人數(shù)字助理創(chuàng)建應(yīng)用程序,而不必編寫任何 Palm OS 本地代碼。通過使用圖形用戶界面,用戶可以創(chuàng)建窗體,向窗體中添加控件,然后連接這些控件的事件來創(chuàng)建 Palm 應(yīng)用程序。測(cè)試人員發(fā)現(xiàn),隨著不斷創(chuàng)建和刪除窗體和控件,這個(gè) Java 應(yīng)用程序最終會(huì)耗盡內(nèi)存。開發(fā)人員沒有檢測(cè)到這個(gè)問題,因?yàn)樗麄兊臋C(jī)器有更多的物理內(nèi)存。
      
      為了研究這個(gè)問題,我用 JProbe 來確定什么地方出了差錯(cuò)。盡管用了 JProbe 所提供的強(qiáng)大工具和內(nèi)存快照,研究仍然是一個(gè)冗長乏味、不斷重復(fù)的過程,首先要確定出現(xiàn)內(nèi)存漏洞的原因,然后修改代碼,最后還得檢驗(yàn)結(jié)果。
      
      JProbe 提供幾個(gè)選項(xiàng),用來控制調(diào)試期間實(shí)際記錄哪些信息。經(jīng)過幾次試驗(yàn)以后,我斷定獲取所需信息的最有效方法是,關(guān)閉性能數(shù)據(jù)收集,而將注重力集中在所捕捉的堆數(shù)據(jù)上。JProbe 提供了一個(gè)稱為 Runtime Heap Summary 的視圖,它顯示 Java 應(yīng)用程序運(yùn)行時(shí)所占用的堆內(nèi)存量隨時(shí)間的變化。它還提供了一個(gè)工具欄按鈕,必要時(shí)可以強(qiáng)制 JVM 執(zhí)行垃圾收集。假如您試圖弄清楚,當(dāng) Java 應(yīng)用程序不再需要給定的類實(shí)例時(shí),這個(gè)實(shí)例會(huì)不會(huì)被作為垃圾收集,這個(gè)功能將很有用。圖 2 顯示了使用中的堆存儲(chǔ)量隨時(shí)間的變化。
      
     

      
    圖 2. Runtime Heap Summary

      
      在 Heap Usage Chart 中,藍(lán)色部分表明已分配的堆空間大小。在啟動(dòng)這個(gè) Java 程序并達(dá)到穩(wěn)定狀態(tài)以后,我強(qiáng)制垃圾收集器運(yùn)行,在圖中的表現(xiàn)就是綠線(這條線表明插入了一個(gè)檢查點(diǎn))左側(cè)的藍(lán)線的驟降。隨后,我添加了四個(gè)窗體,然后又將它們刪除,并再次調(diào)用了垃圾收集器。當(dāng)程序返回僅有一個(gè)可視窗體的初始狀態(tài)時(shí),檢查點(diǎn)之后的藍(lán)色區(qū)域高于檢查點(diǎn)之前的藍(lán)色區(qū)域這一情況表明可能存在內(nèi)存漏洞。我通過查看 Instance Summary 證實(shí)確實(shí)有一個(gè)漏洞,因?yàn)?Instance Summary 表明 FormFrame 類(它是窗體的主用戶界面類)的計(jì)數(shù)在檢查點(diǎn)之后增加了 4。
      
      查找原因
      為了將測(cè)試人員報(bào)告的問題剔出,我采取的第一個(gè)步驟是找出幾個(gè)簡(jiǎn)單的、可重復(fù)的測(cè)試案例。就本例而言,我發(fā)現(xiàn)只須添加一個(gè)窗體,將它刪除,然后強(qiáng)制執(zhí)行垃圾收集,結(jié)果就會(huì)導(dǎo)致與被刪除窗體相關(guān)聯(lián)的許多類實(shí)例仍然處于活動(dòng)狀態(tài)。這個(gè)問題在 JProbe 的 Instance Summary 視圖中很明顯,這個(gè)視圖統(tǒng)計(jì)每個(gè) Java 類在堆中的實(shí)例數(shù)。
      
      為了查明使垃圾收集器無法正常完成其工作的那些引用,我使用 JProbe 的 Reference Graph(如圖 3 所示)來確定哪些類仍然引用著目前未被刪除的 FormFrame 類。在調(diào)試這個(gè)問題時(shí)該過程是最復(fù)雜的過程之一,因?yàn)槲野l(fā)現(xiàn)許多不同的對(duì)象仍然引用著這個(gè)無用的對(duì)象。用來查明究竟是哪個(gè)引用者真正造成這個(gè)問題的試錯(cuò)過程相當(dāng)耗時(shí)。
      
      在本例中,一個(gè)根類(左上角用紅色標(biāo)明的那個(gè)類)是問題的發(fā)源地。右側(cè)用藍(lán)色突出顯示的類處在從最初的 FormFrame 類跟蹤而來的路徑上。
      


      
    圖 3. 在引

    資料引用:http://www.knowsky.com/365325.html

    posted @ 2008-09-19 17:10 小馬歌 閱讀(270) | 評(píng)論 (0)編輯 收藏
     
    動(dòng)態(tài)口令,也被成為一次性口令(OTP,One-Time password)
      OTP試圖解決用戶選擇強(qiáng)壯密碼時(shí)的一些問題。大多數(shù)OTP基于雙要素認(rèn)證原則運(yùn)行。要認(rèn)證一個(gè)系統(tǒng),你需要擁有一個(gè)令牌卡和你的個(gè)人識(shí)別碼(PIN personal identification number)。生成和同步密碼的方法隨OTP系統(tǒng)的不同而不同。在一種比較流行的OTP方法中,令牌卡在一個(gè)時(shí)間間隔內(nèi)(通常為 60S)生成登陸密碼。這個(gè)看上去隨機(jī)的數(shù)字串實(shí)際上與OTP服務(wù)器和令牌上運(yùn)行的數(shù)學(xué)算法緊密相關(guān)。一個(gè)由令牌生成的登錄密碼可能類似這樣:4F40D974。PIN要么與算法一起使用生成登錄密碼(隨后變成OTP),要么與登陸密碼一起使用。
      使用由算法和PIN生成登錄密碼的系統(tǒng)防止個(gè)人反復(fù)嗅探網(wǎng)絡(luò)后獲得用戶的PIN。OTP用以下方法改進(jìn)了密碼:
      >用戶再也不能選擇弱密碼
      >用戶只要記住PIN,而不用記住傳統(tǒng)的強(qiáng)密碼
      > 一旦密碼被使用一次,線路上嗅探到的密碼就已經(jīng)失效
      當(dāng)然沒有大面積的密碼系統(tǒng)使用OTP是有原因的,OTP也有一些缺點(diǎn):
      > 用戶需要擁有令牌卡進(jìn)行認(rèn)證
      >OTP需要一臺(tái)額外的服務(wù)器接受來自認(rèn)證服務(wù)器中繼的請(qǐng)求
      >使用OTP輸入一個(gè)密碼比輸入一個(gè)用戶需要記住的密碼時(shí)間花費(fèi)更高
      > 在大型網(wǎng)絡(luò)中OTP價(jià)格不菲
      當(dāng)考慮OTP總體評(píng)價(jià)時(shí),它顯然是一種有價(jià)值的技術(shù),只是不能到處使用。大多數(shù)的機(jī)構(gòu)選擇將OTP用于他們安全策略中的關(guān)鍵系統(tǒng),或用在密碼破解嘗試較多的地方。對(duì)于一個(gè)典型的機(jī)構(gòu),該地方以為著是財(cái)務(wù)和人力資源系統(tǒng),也可以是撥號(hào)或虛擬專用網(wǎng)這樣的遠(yuǎn)程系統(tǒng)。
      動(dòng)態(tài)口令,又叫動(dòng)態(tài)令牌、動(dòng)態(tài)密碼。它的主要原理是:用戶登錄前,依據(jù)用戶私人身份信息,并引入隨機(jī)數(shù)產(chǎn)生隨機(jī)變化的口令,使每次登錄過程中傳送的口令信息都不同,以提高登錄過程中用戶身份認(rèn)證的安全性。
      由于口令每次都變化,即使得到密碼也沒用,而且這種動(dòng)態(tài)口令由專用算法生成,隨機(jī)性高,不太容易被破解。因此,動(dòng)態(tài)口令極大地提高了用戶身份認(rèn)證的安全性。
    posted @ 2008-09-19 17:07 小馬歌 閱讀(1226) | 評(píng)論 (0)編輯 收藏
     
    在上兩講中,筆者介紹了DirectShow的應(yīng)用原理以及開發(fā)Filter之前的一些預(yù)備知識(shí)。這一講,筆者就要手把手教你如何寫自己的Filter啦。
    首先,從VC++的項(xiàng)目開始(請(qǐng)確認(rèn)你已經(jīng)給VC++配置好了DirectX的開發(fā)環(huán)境)。寫自己的Filter,第一步是使用VC++建立一個(gè)Filter的項(xiàng)目。由于DirectX SDK提供了很多Filter的例子項(xiàng)目(位于DXSDK\samples\Multimedia\DirectShow\ Filters目錄下),最簡(jiǎn)單的方法就是拷貝一個(gè),然后再在此基礎(chǔ)上修改。但如果你是Filter開發(fā)的初學(xué)者,筆者并不贊成這么做。
    自己新建一個(gè)Filter項(xiàng)目也很簡(jiǎn)單。使用VC++的向?qū)В⒁粋€(gè)空的”Win32 Dynamic-link Library”項(xiàng)目。注意,幾個(gè)文件是必須有的:.def文件,定義四個(gè)導(dǎo)出函數(shù);定義Filter類的.cpp文件和.h文件,并在.cpp文件中定義Filter的注冊(cè)信息以及兩個(gè)Filter的注冊(cè)函數(shù):DllRegisterServer和DllUnregisterServer。(注:Filter的注冊(cè)信息是Filter在注冊(cè)時(shí)寫到注冊(cè)表里的內(nèi)容,格式可以參考SDK的示例代碼,F(xiàn)ilter相關(guān)的GUID務(wù)必使用GuidGen.exe產(chǎn)生。)接下去進(jìn)行項(xiàng)目的設(shè)置(Project->Settings…)。此時(shí),你可以打開一個(gè)SDK的例子項(xiàng)目進(jìn)行對(duì)比,有些宏定義完全可以照抄,最后注意將輸出文件的擴(kuò)展名改為.ax。
    上一講曾經(jīng)提到過,在寫Filter之前,選擇一個(gè)合適的Filter基類是至關(guān)重要的。為此,你必須對(duì)幾個(gè)Filter的基類有相當(dāng)?shù)牧私狻T趯?shí)際應(yīng)用中,F(xiàn)ilter的基類并不總是選擇CBaseFilter的。相反,因?yàn)槲覀兘^大部分寫的都是中間的傳輸Filter(Transform Filter),所以基類選擇CTransformFilter和CTransInPlaceFilter的居多。如果我們寫的是源Filter,我們可以選擇CSource作為基類;如果是Renderer Filter,可以選擇CBaseRenderer或CBaseVideoRenderer等。
    總之,選擇好Filter的基類是很重要的。當(dāng)然,選擇Filter的基類也是很靈活的,沒有絕對(duì)的標(biāo)準(zhǔn)。能夠通過CTransformFilter實(shí)現(xiàn)的Filter當(dāng)然也能從CBaseFilter一步一步實(shí)現(xiàn)。下面,筆者就從本人的實(shí)際經(jīng)驗(yàn)出發(fā),對(duì)Filter基類的選擇提出幾點(diǎn)建議供大家參考。
    首先,你必須明確這個(gè)Filter要完成什么樣的功能,即要對(duì)Filter項(xiàng)目進(jìn)行需求分析。請(qǐng)盡量保持Filter實(shí)現(xiàn)的功能的單一性。如果必要的話,你可以將需求分解,由兩個(gè)(或者更多的)功能單一的Filter去實(shí)現(xiàn)總的功能需求。
    其次,你應(yīng)該明確這個(gè)Filter大致在整個(gè)Filter Graph的位置,這個(gè)Filter的輸入是什么數(shù)據(jù),輸出是什么數(shù)據(jù),有幾個(gè)輸入Pin、幾個(gè)輸出Pin等等。你可以畫出這個(gè)Filter的草圖。弄清這一點(diǎn)十分重要,這將直接決定你使用哪種“模型”的Filter。比如,如果Filter僅有一個(gè)輸入Pin和一個(gè)輸出Pin,而且一進(jìn)一處的媒體類型相同,則一般采用CTransInPlaceFilter作為Filter的基類;如果媒體類型不一樣,則一般選擇CTransformFilter作為基類。
    再者,考慮一些數(shù)據(jù)傳輸、處理的特殊性要求。比如Filter的輸入和輸出的Sample并不是一一對(duì)應(yīng)的,這就一般要在輸入Pin上進(jìn)行數(shù)據(jù)的緩存,而在輸出Pin上使用專門的線程進(jìn)行數(shù)據(jù)處理。這種情況下,F(xiàn)ilter的基類選擇CSource為宜(雖然這個(gè)Filter并不是源Filter)。
    當(dāng)Filter的基類選定了之后,Pin的基類也就相應(yīng)選定了。接下去,就是Filter和Pin上的代碼實(shí)現(xiàn)了。有一點(diǎn)需要注意的是,從軟件設(shè)計(jì)的角度上來說,應(yīng)該將你的邏輯類代碼同F(xiàn)ilter的代碼分開。下面,我們一起來看一下輸入Pin的實(shí)現(xiàn)。你需要實(shí)現(xiàn)基類所有的純虛函數(shù),比如CheckMediaType等。在CheckMediaType內(nèi),你可以對(duì)媒體類型進(jìn)行檢驗(yàn),看是否是你期望的那種。因?yàn)榇蟛糠諪ilter采用的是推模式傳輸數(shù)據(jù),所以在輸入Pin上一般都實(shí)現(xiàn)了Receive方法。有的基類里面已經(jīng)實(shí)現(xiàn)了Receive,而在Filter類上留一個(gè)純虛函數(shù)供用戶重載進(jìn)行數(shù)據(jù)處理。這種情況下一般是無需重載Receive方法的,除非基類的實(shí)現(xiàn)不符合你的實(shí)際要求。而如果你重載了Receive方法,一般會(huì)同時(shí)重載以下三個(gè)函數(shù)EndOfStream、BeginFlush和EndFlush。我們?cè)賮砜匆幌螺敵鯬in的實(shí)現(xiàn)。一般情況下,你要實(shí)現(xiàn)基類所有的純虛函數(shù),除了CheckMediaType進(jìn)行媒體類型檢查外,一般還有DecideBufferSize以決定Sample使用內(nèi)存的大小,GetMediaType提供支持的媒體類型。最后,我們看一下Filter類的實(shí)現(xiàn)。首先當(dāng)然也要實(shí)現(xiàn)基類的所有純虛函數(shù)。除此之外,F(xiàn)ilter還要實(shí)現(xiàn)CreateInstance以提供COM的入口,實(shí)現(xiàn)NonDelegatingQueryInterface以暴露支持的接口。如果我們創(chuàng)建了自定義的輸入、輸出Pin,一般我們還要重載GetPinCount和GetPin兩個(gè)函數(shù)。
    Filter框架的實(shí)現(xiàn)大致就是這樣。你或許還想知道怎樣在Filter上實(shí)現(xiàn)一個(gè)自定義的接口,以及怎么實(shí)現(xiàn)Filter的屬性頁等等。限于篇幅,筆者就不展開闡述了。其實(shí),這些問題都能在SDK的示例項(xiàng)目中找到答案。其他的,關(guān)于在實(shí)際編程中應(yīng)該注意的一些問題,筆者整理了一下,供大家參考。
    1.    鎖(Lock)問題
    DirectShow應(yīng)用程序至少包含有兩條線程:一條主線程和一條數(shù)據(jù)傳輸線程。既然是多線程,肯定會(huì)碰到線程同步的問題。Filter有兩種鎖:Filter對(duì)象鎖和數(shù)據(jù)流鎖。Filter對(duì)象鎖用于Filter級(jí)別的如Filter狀態(tài)轉(zhuǎn)換、BeginFlush、EndFlush等;數(shù)據(jù)流鎖用于數(shù)據(jù)處理線程內(nèi),比如Receive、EndOfStream等。如果這兩種鎖沒有搞清楚,很容易產(chǎn)生程序的死鎖,這一點(diǎn)特別需要提醒。
    2.    EndOfStream問題
    當(dāng)Filter接收到這個(gè)“消息”,意味著上一級(jí)Filter的數(shù)據(jù)都已經(jīng)發(fā)送完畢。在這之后,如果Receive再有數(shù)據(jù)接收,也不應(yīng)該去理睬它。如果Filter對(duì)輸入Pin上的數(shù)據(jù)進(jìn)行了緩存,在接收到EndOfStream后應(yīng)確保所有緩存的數(shù)據(jù)都已經(jīng)處理過了才能返回。
    3.    Media Seeking問題
    一般情況下,你只需要在Filter的輸出Pin上實(shí)現(xiàn)NonDelegatingQueryInterface方法,當(dāng)用戶申請(qǐng)得到IID_ImediaPosition接口或IID_IMediaSeeking接口時(shí)將請(qǐng)求往上一級(jí)Filter的輸出Pin上傳遞。當(dāng)Filter Graph進(jìn)行Mediaseeking的時(shí)候,一般會(huì)調(diào)用Filter上的BeginFlush、EndFlush和NewSegment。如果你的Filter對(duì)數(shù)據(jù)進(jìn)行了緩存,你就要重載它們,并做出相應(yīng)的處理。如果你的Filter負(fù)責(zé)給發(fā)送出去的Sample打時(shí)間戳,那么,在Mediaseeking之后應(yīng)該重新從零開始打起。
    4.    關(guān)于使用專門的線程
    如果你使用了專門的線程進(jìn)行數(shù)據(jù)的處理和發(fā)送,你需要特別小心,不要讓線程進(jìn)行死循環(huán),并且要讓線程處理函數(shù)能夠去時(shí)時(shí)檢查線程命令。應(yīng)該確保在Filter結(jié)束工作的時(shí)候,線程也能正常地結(jié)束。有時(shí)候,你把GraphEdit程序關(guān)掉,但GraphEdit進(jìn)程仍在內(nèi)存中,往往就是因?yàn)閿?shù)據(jù)線程沒有安全關(guān)閉這個(gè)原因。
    5.    如何從媒體類型中獲取信息
    比如,你想在輸入Pin連接的媒體類型中,獲取視頻圖像的寬、高等信息,你應(yīng)該在輸入Pin的CompleteConnect方法中實(shí)現(xiàn),而不要在SetMediaType中。
    posted @ 2008-09-19 15:07 小馬歌 閱讀(528) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題
    共95頁: First 上一頁 79 80 81 82 83 84 85 86 87 下一頁 Last 
     
    主站蜘蛛池模板: 亚洲国产精品白丝在线观看| 亚洲成在人线av| 亚洲精品高清在线| 图图资源网亚洲综合网站| 亚洲免费观看网站| 亚洲AV成人一区二区三区观看| 日日摸夜夜添夜夜免费视频| 国产成人久久AV免费| 成人看的午夜免费毛片| 亚洲日韩人妻第一页| 亚洲午夜久久影院| 亚洲国产成人久久综合| 久久www免费人成精品香蕉| 最近2019中文字幕免费大全5| 免费无码黄网站在线观看| 国产亚洲大尺度无码无码专线| 亚洲视频手机在线| 亚洲av无码av在线播放| 青柠影视在线观看免费高清 | 国产麻豆视频免费观看| 国产一级淫片a视频免费观看| 国产亚洲成AV人片在线观黄桃| 亚洲成人一级电影| 色爽黄1000部免费软件下载| 一区二区三区福利视频免费观看| 日本高清免费网站| 亚洲AV无码一区二区二三区入口| 日本亚洲色大成网站www久久| 精品国产免费人成网站| 青青视频观看免费99| 亚洲人成色7777在线观看不卡 | 大桥未久亚洲无av码在线| 大地资源网高清在线观看免费| 人妻视频一区二区三区免费| 亚洲视频在线免费| 国产99在线|亚洲| 久久香蕉国产线看免费| 国产又大又粗又硬又长免费 | 一级毛片在线观看免费| 免费大黄网站在线看| 亚洲成人免费网址|