windows運行命令詳解
winver---------檢查Windows版本
wmimgmt.msc----打開windows管理體系結構(WMI)
wupdmgr--------windows更新程序
wscript--------windows腳本宿主設置
write----------寫字板
winmsd---------系統信息
wiaacmgr-------掃描儀和照相機向導
winchat--------XP自帶局域網聊天
mem.exe--------顯示內存使用情況
Msconfig.exe---系統配置實用程序
mplayer2-------簡易widnows media player
mspaint--------畫圖板
mstsc----------遠程桌面連接
mplayer2-------媒體播放機
magnify--------放大鏡實用程序
mmc------------打開控制臺
mobsync--------同步命令
dxdiag---------檢查DirectX信息
drwtsn32------ 系統醫生
devmgmt.msc--- 設備管理器
dfrg.msc-------磁盤碎片整理程序
diskmgmt.msc---磁盤管理實用程序
dcomcnfg-------打開系統組件服務
ddeshare-------打開DDE共享設置
dvdplay--------DVD播放器
net stop messenger-----停止信使服務
net start messenger----開始信使服務
notepad--------打開記事本
nslookup-------網絡管理的工具向導
ntbackup-------系統備份和還原
narrator-------屏幕“講述人”
ntmsmgr.msc----移動存儲管理器
ntmsoprq.msc---移動存儲管理員操作請求
netstat -an----(TC)命令檢查接口
syncapp--------創建一個公文包
sysedit--------系統配置編輯器
sigverif-------文件簽名驗證程序
sndrec32-------錄音機
shrpubw--------創建共享文件夾
secpol.msc-----本地安全策略
syskey---------系統加密,一旦加密就不能解開,保護windows xp系統的雙重密碼
services.msc---本地服務設置
Sndvol32-------音量控制程序
sfc.exe--------系統文件檢查器
sfc /scannow---windows文件保護
tsshutdn-------60秒倒計時關機命令
tourstart------xp簡介(安裝完成后出現的漫游xp程序)
taskmgr--------任務管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打開資源管理器
packager-------對象包裝程序
perfmon.msc----計算機性能監測程序
progman--------程序管理器
regedit.exe----注冊表
rsop.msc-------組策略結果集
regedt32-------注冊表編輯器
rononce -p ----15秒關機
regsvr32 /u *.dll----停止dll文件運行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盤檢查
certmgr.msc----證書管理實用程序
calc-----------啟動計算器
charmap--------啟動字符映射表
cliconfg-------SQL SERVER 客戶端網絡實用程序
Clipbrd--------剪貼板查看器
conf-----------啟動netmeeting
compmgmt.msc---計算機管理
cleanmgr-------垃圾整理
ciadv.msc------索引服務程序
osk------------打開屏幕鍵盤
odbcad32-------ODBC數據源管理器
oobe/msoobe /a----檢查XP是否激活
lusrmgr.msc----本機用戶和組
logoff---------注銷命令
iexpress-------木馬捆綁工具,系統自帶
Nslookup-------IP地址偵測器
fsmgmt.msc-----共享文件夾管理器
utilman--------輔助工具管理器
gpedit.msc-----組策略
posted @
2006-05-25 01:08 Jerry Cat 閱讀(490) |
評論 (0) |
編輯 收藏
??? [轉]使用Shell API讀取"特殊"路徑設置
????最近編碼,在取用戶文檔數據目錄時,遇到問題:
????我的做法是:<系統盤>?+?"\Documents?and?Settings\"?+?<用戶名>?+?"\Application?Data\"
????為啥這么麻煩,因為當時我沒有找到合適的API,有什么問題呢?
????問題出在用戶名,假如我的用戶名是Stone,但文檔數據目錄卻有可能存在兩種,一是:Stone,
還有可能是?Stone.域名。但實際上Stone都是域用戶。出現此情況的原因不明。而取用戶名的函數用
的是?GetUserName(也試過其它),域名當然也可以取出,但何時帶域名,何時不帶域名的規律不得而
知。?
??? 所以,還是只能去查到API,其實Windows?Shell?API有此類函數,只不過使用比較特殊。
????代碼如下:?
????LPITEMIDLIST?pidl;
????SHGetSpecialFolderLocation(NULL,CSIDL_APPDATA,&pidl);
????if?(?pidl?)?{
?????? TCHAR?szPathName[1024];
?????? SHGetPathFromIDList(pidl,szPathName);
?????? LPMALLOC?pMalloc;?
?????? SHGetMalloc(?&pMalloc?);
?????? pMalloc->Free(pidl);
????}?
????更換其中參數CSIDL_APPDATA,可以得到很多的系統設置值。用此方法,將前文所講的判定給了
API,不再有問題。
posted @
2006-05-25 00:10 Jerry Cat 閱讀(764) |
評論 (0) |
編輯 收藏
MFC下的文件類
轉自
http://www.shnenglu.com/RancyGe/archive/2006/05/22/7496.html
1、文件操作的方法
?? 使用Visual C++編程,有如下方法進行文件操作:
(1)使用標準C運行庫函數,包括fopen、fclose、fseek等。
(2)使用Win16下的文件和目錄操作函數,如lopen、lclose、lseek等。不過,在Win32下,這些函數主要是為了和Win16向后兼容。
(3)使用Win32下的文件和目錄操作函數,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。
???????? Win32下,打開和創建文件都由CreateFile完成,成功的話,得到一個Win32下的句柄,這不同于“C”的fopen返回的句柄。在Win16下,該句柄和C運行庫文件操作函數相容。但在Win32下,“C”的文件操作函數不能使用該句柄,如果需要的話,可以使用函數_open_osfhandle從Win32句柄得到一個“C”文件函數可以使用的文件句柄。 關閉文件使用Win32的CloseHandle。 在Win32下,CreateFile可以操作的對象除了磁盤文件外,還包括設備文件如通訊端口、管道、控制臺輸入、郵件槽等等。
(4)使用CFile和其派生類進行文件操作。CFile從CObject派生,其派生類包括操作文本文件的CStdioFile,操作內存文件的CmemFile,等等。CFile是建立在Win32的文件操作體系的基礎上,它封裝了部分Win32文件操作函數。最好是使用CFile類(或派生類)的對象來操作文件,必要的話,可以從這些類派生自己的文件操作類。統一使用CFile的界面可以得到好的移植性。
2、文件操作的方法
MFC用一些類來封裝文件訪問的Win32 API。以CFile為基礎,從CFile派生出幾個類,如CStdioFile,CMemFile,MFC內部使用的CMiororFile,等等。
2.1、CFile的結構
2.1.1、CFile定義的枚舉類型
CFile類定義了一些和文件操作相關的枚舉類型,主要有四種:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分別解釋這些枚舉類型。
OpenFlags
OpenFlags定義了13種文件訪問和共享模式:
enum OpenFlags {
//第一(從右,下同)至第二位,打開文件時訪問模式,讀/寫/讀寫
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000, //32位MFC中沒用
//第五到第七位,打開文件時的共享模式
shareExclusive = 0x0010,//獨占方式,禁止其他進程讀寫
shareDenyWrite = 0x0020,//禁止其他進程寫
shareDenyRead = 0x0030,//禁止其他進程讀
shareDenyNone = 0x0040,//允許其他進程寫
//第八位,打開文件時的文件繼承方式
modeNoInherit = 0x0080,//不允許子進程繼承
//第十三、十四位,是否創建新文件和創建方式
modeCreate = 0x1000,//創建新文件,文件長度0
modeNoTruncate = 0x2000,//創建新文件時如文件已存在則打開
//第十五、十六位,文件以二進制或者文本方式打開,在派生類CStdioFile中用
typeText = 0x4000,
typeBinary = (int)0x8000
};
Attribute
Attribute定義了文件屬性:正常、只讀、隱含、系統文件,文件或者目錄等。
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
}
SeekPosition
SeekPosition定義了三種文件位置:頭、尾、當前:
enum SeekPosition{
begin = 0x0,
current = 0x1,
end = 0x2
};
hFileNull
hFileNull定義了空文件句柄
enum { hFileNull = -1 };
2.1.2、CFile的其他一些成員變量
CFile除了定義枚舉類型,還定義了一些成員變量。例如:
UINT m_hFile
該成員變量是public訪問屬性,保存::CreateFile返回的操作系統的文件句柄。MFC重載了運算符號HFILE來返回m_hFile,這樣在使用HFILE類型變量的地方可以使用CFile對象。
BOOL m_bCloseOnDelete;
CString m_strFileName;
這兩個成員變量是protected訪問屬性。m_bCloseOnDelete用來指示是否在關閉文件時刪除CFile對象;m_strFileName用來保存文件名。
2.1.3、CFile的成員函數
CFile的成員函數實現了對Win32文件操作函數的封裝,完成以下動作:打開、創建、關閉文件,文件指針定位,文件的鎖定與解鎖,文件狀態的讀取和修改,等等。其中,用到了m_hFile文件句柄的一般是虛擬函數,和此無關的一般是靜態成員函數。一般地,成員函數被映射到對應的Win32函數,如表11-1所示。
??????? 表11-1 CFile函數對Win32文件函數的封裝
虛擬
|
靜態
|
成員函數
|
對應的Win32函數
|
文件的創建、打開、關閉
|
√
|
|
Abort
|
CloseHandle
|
√
|
|
Duplicate
|
DuplicateHandle
|
√
|
|
Open
|
CreateFile
|
√
|
|
Close
|
CloseHandle
|
文件的讀寫
|
√
|
|
Read
|
ReadFile
|
|
|
ReadHuge(向后兼容)
|
調用Read成員函數
|
√
|
|
Write
|
WriteFile
|
|
|
WriteHuage(向后兼容)
|
調用Write成員函數
|
√
|
|
Flush
|
FlushFileBuffers
|
文件定位
|
√
|
|
Seek
|
SetFilePointer
|
|
|
SeekToBegin
|
調用Seek成員函數
|
|
|
SeekToEnd
|
調用Seek成員函數
|
√
|
|
GetLength
|
調用Seek成員函數
|
√
|
|
SetLength
|
SetEndOfFile
|
文件的鎖定/解鎖
|
√
|
|
LockRange
|
LockFile
|
√
|
|
UnlockRange
|
UnlockFile
|
文件狀態操作函數
|
√
|
|
GetPosition
|
SetFilePointer
|
|
|
GetStatus(CFileStatus&)
|
GetFileTime,GetFileSize等
|
|
√
|
GetStatus(LPSTR lpszFileName CFileStatus&)
|
FindFirstFile
|
√
|
|
GetFileName
|
不是簡單地映射到某個函數
|
√
|
|
GetFileTitle
|
|
√
|
|
GetFilePath
|
|
√
|
|
SetFilePath
|
|
|
√
|
SetStatus
|
|
改名和刪除
|
|
√
|
Rename
|
MoveFile
|
|
√
|
Remove
|
DeleteFile
|
2.1.4、CFile的部分實現
這里主要討論CFile對象的構造函數和文件的打開/創建的過程。
構造函數
CFile有如下幾個構造函數:
CFile()
缺省構造函數,僅僅構造一個CFile對象,還必須使用Open成員函數來打開文件。
CFile(int hFile)
已經打開了一個文件hFile,在此基礎上構造一個CFile對象來給它打包。HFile將被賦值給CFile的成員變量m_hFile。
CFile(LPCTSTR lpszFileName, UINT nOpenFlags)
指定一個文件名和文件打開方式,構造CFile對象,調用Open打開/創建文件,把文件句柄保存到m_hFile。
打開/創建文件
Open的原型如下:
BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,
CFileException* pException)
Open調用Win32函數::CreateFile打開文件,并把文件句柄保存到成員變量m_hFile中。
CreateFile函數的原型如下:
HANDLE CreateFile(
?LPCTSTR lpFileName,?? // pointer to name of the file
?DWORD dwDesiredAccess,// access (read-write) mode
?DWORD dwShareMode,??? // share mode
?LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
?DWORD dwCreationDistribution,// how to create
?DWORD dwFlagsAndAttributes,? // file attributes
?HANDLE hTemplateFile???????? // handle to file with attributes to copy
);
顯然,Open必須把自己的兩個參數lpszFileName和nOpenFlags映射到CreateFile的七個參數上。
從OpenFlags的定義可以看出,(nOpenFlags & 3)表示了讀寫標識,映射成變量dwAccess,可以取值為Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。
(nOpenFlags & 0x70)表示了共享模式,映射成變量dwShareMode,可以取值為Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。
Open定義了一個局部的SECURITY_ATTRIBUTES變量sa,(nOpenFlags & 0x80)被賦值給sa.bInheritHandle。
(nOpenFlags & modeCreate)表示了創建方式,映射成變量dwCreateFlag,可以取值為Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。
在生成了上述參數之后,先調用::CreateFile:
HANDLE hFile =::CreateFile(lpszFileName,
dwAccess, dwShareMode, &sa,
dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
然后,hFile被賦值給成員變量m_hFile,m_bCloseOnDelete被設置為TRUE。
由上可以看出,CFile打開(創建)一個文件時大大簡化了:: CreateFile函數的復雜性,即只需要指定一個文件名、一個打開文件的參數即可。若該參數指定為0,則表示以只讀方式打開一個存在的文件,獨占使用,不允許子進程繼承。
在CFile對象使用時,如果它是在堆中分配的,則應該銷毀它;如果在棧中分配的,則CFile對象將被自動銷毀。銷毀時析構函數被調用,析構函數是虛擬函數。若m_bCloseOnDelete為真且m_hFile非空,則析構函數調用Close關閉文件。
至于其他CFile成員函數的實現,這里不作分析了。
2.1.5、CFile的派生類
這里主要簡要地介紹CStdioFile和CmemFile及CFileFind。
CStdioFile
CStdioFile對文本文件進行操作。
CStdioFile定義了新的成員變量m_pStream,類型是FILE*。在打開或者創建文件時,使用_open_osfhandle從m_hFile(Win32文件句柄)得到一個“C”的FILE類型的文件指針,然后,在文件操作中,使用“C”的文件操作函數。例如,讀文件使用_fread,而不是::ReadFile,寫文件使用了_fwrite,而不是::WriteFile,等等。m_hFile是CFile的成員變量。
另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是實現了兩個新的操作ReadString和WriteString。
CMemFile
CMemFile把一塊內存當作一個文件來操作,所以,它沒有打開文件的操作,而是設計了Attach和Detach用來分配或者釋放一塊內存。相應地,它提供了Alloc、Free虛擬函數來操作內存文件,它覆蓋了Read、Write來讀寫內存文件。
CFileFind
為了方便文件查找,MFC把有關功能歸結成為一個類CFileFind。CFileFind派生于CObject類。首先,它使用FindFile和FineNextFile包裝了Win32函數::FindFirstFile和::FindNextFile;其次,它提供了許多函數用來獲取文件的狀態或者屬性。
使用CFileStatus結構來描述文件的屬性,其定義如下:
struct CFileStatus
{
???????CTime m_ctime; // 文件創建時間
???????CTime m_mtime; // 文件最近一次修改時間
???????CTime m_atime; // 文件最近一次訪問時間
???????LONG m_size; // 文件大小
???????BYTE m_attribute; // 文件屬性
???????BYTE _m_padding; // 沒有實際含義,用來增加一個字節
???????TCHAR m_szFullName[_MAX_PATH]; //絕對路徑
#ifdef _DEBUG
//實現Dump虛擬函數,輸出文件屬性
void Dump(CDumpContext& dc) const;
#endif
};
例如:
CFileStatus status;
pFile->GetStatus(status);
#ifdef _DEBUG
status.dump(afxDump);
#endif
posted @
2006-05-23 21:17 Jerry Cat 閱讀(734) |
評論 (1) |
編輯 收藏
static_cast<>揭密
作者:Sam NG
譯者:
小刀人
原文鏈接:
What static_cast<> is actually doing?
本文討論static_cast<> 和 reinterpret_cast<>。
介紹
大多程序員在學C++前都學過C,并且習慣于C風格(類型)轉換。當寫C++(程序)時,有時候我們在使用static_cast<>和reinterpret_cast<>時可能會有點模糊。在本文中,我將說明static_cast<>實際上做了什么,并且指出一些將會導致錯誤的情況。
泛型(Generic Types)
??????? float f = 12.3;
??????? float* pf = &f;
??????? // static cast<>
??????? // 成功編譯, n = 12
??????? int n = static_cast<int>(f);
??????? // 錯誤,指向的類型是無關的(譯注:即指針變量pf是float類型,現在要被轉換為int類型)
??????? //int* pn = static_cast<int*>(pf);
??????? //成功編譯
??????? void* pv = static_cast<void*>(pf);
??????? //成功編譯, 但是 *pn2是無意義的內存(rubbish)
??????? int* pn2 = static_cast<int*>(pv);// reinterpret_cast<>
??????? //錯誤,編譯器知道你應該調用static_cast<>
??????? //int i = reinterpret_cast<int>(f);
??????? //成功編譯, 但是 *pn 實際上是無意義的內存,和 *pn2一樣
??????? int* pi = reinterpret_cast<int*>(pf);
簡而言之,static_cast<> 將嘗試轉換,舉例來說,如float-到-integer,而reinterpret_cast<>簡單改變編譯器的意圖重新考慮那個對象作為另一類型。
指針類型(Pointer Types)
指針轉換有點復雜,我們將在本文的剩余部分使用下面的類:
class CBaseX
????? {
????? public:
????? int x;
????? CBaseX() { x = 10; }
????? void foo() { printf("CBaseX::foo() x=%d\n", x); }
????? };
????? class CBaseY
??????? {
??????? public:
??????? int y;
??????? int* py;
??????? CBaseY() { y = 20; py = &y; }
??????? void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py);
??????? }
??????? };class CDerived : public CBaseX, public CBaseY
??????? {
??????? public:
??????? int z;
??????? };
情況1:兩個無關的類之間的轉換
????? // Convert between CBaseX* and CBaseY*
????? // CBaseX* 和 CBaseY*之間的轉換
????? CBaseX* pX = new CBaseX();
????? // Error, types pointed to are unrelated
????? // 錯誤, 類型指向是無關的
????? // CBaseY* pY1 = static_cast<CBaseY*>(pX);
????? // Compile OK, but pY2 is not CBaseX
????? // 成功編譯, 但是 pY2 不是CBaseX
????? CBaseY* pY2 = reinterpret_cast<CBaseY*>(pX);
????? // System crash!!
????? // 系統崩潰!!
????? // pY2->bar();
正如我們在泛型例子中所認識到的,如果你嘗試轉換一個對象到另一個無關的類static_cast<>將失敗,而reinterpret_cast<>就總是成功“欺騙”編譯器:那個對象就是那個無關類。
情況2:轉換到相關的類
????? 1. CDerived* pD = new CDerived();
????? 2. printf("CDerived* pD = %x\n", (int)pD);
????? 3.
????? 4. // static_cast<> CDerived* -> CBaseY* -> CDerived*
????? //成功編譯,隱式static_cast<>轉換
????? 5. CBaseY* pY1 = pD;
????? 6. printf("CBaseY* pY1 = %x\n", (int)pY1);
????? // 成功編譯, 現在 pD1 = pD
????? 7. CDerived* pD1 = static_cast<CDerived*>(pY1);
????? 8. printf("CDerived* pD1 = %x\n", (int)pD1);
????? 9.
????? 10. // reinterpret_cast
????? // 成功編譯, 但是 pY2 不是 CBaseY*
????? 11. CBaseY* pY2 = reinterpret_cast<CBaseY*>(pD);
????? 12. printf("CBaseY* pY2 = %x\n", (int)pY2);
????? 13.
????? 14. // 無關的 static_cast<>
????? 15. CBaseY* pY3 = new CBaseY();
????? 16. printf("CBaseY* pY3 = %x\n", (int)pY3);
????? // 成功編譯,盡管 pY3 只是一個 "新 CBaseY()"
????? 17. CDerived* pD3 = static_cast<CDerived*>(pY3);
????? 18. printf("CDerived* pD3 = %x\n", (int)pD3);
????? ---------------------- 輸出 ---------------------------
????? CDerived* pD = 392fb8
????? CBaseY* pY1 = 392fbc
????? CDerived* pD1 = 392fb8
????? CBaseY* pY2 = 392fb8
????? CBaseY* pY3 = 390ff0
????? CDerived* pD3 = 390fec
注意:在將CDerived*用隱式 static_cast<>轉換到CBaseY*(第5行)時,結果是(指向)CDerived*(的指針向后) 偏移了4(個字節)(譯注:4為int類型在內存中所占字節數)。為了知道static_cast<> 實際如何,我們不得不要來看一下CDerived的內存布局。?
CDerived的內存布局(Memory Layout)
如圖所示,CDerived的內存布局包括兩個對象,CBaseX 和 CBaseY,編譯器也知道這一點。因此,當你將CDerived* 轉換到 CBaseY*時,它給指針添加4個字節,同時當你將CBaseY*轉換到CDerived*時,它給指針減去4。然而,甚至它即便不是一個CDerived你也可以這樣做。
當然,這個問題只在如果你做了多繼承時發生。在你將CDerived轉換 到 CBaseX時static_cast<> 和 reinterpret_cast<>是沒有區別的。
情況3:void*之間的向前和向后轉換
因為任何指針可以被轉換到void*,而void*可以被向后轉換到任何指針(對于static_cast<> 和 reinterpret_cast<>轉換都可以這樣做),如果沒有小心處理的話錯誤可能發生。
??????? CDerived* pD = new CDerived();
??????? printf("CDerived* pD = %x\n", (int)pD);
??????? CBaseY* pY = pD; // 成功編譯, pY = pD + 4
??????? printf("CBaseY* pY = %x\n", (int)pY);
??????? void* pV1 = pY; //成功編譯, pV1 = pY
??????? printf("void* pV1 = %x\n", (int)pV1);
??????? // pD2 = pY, 但是我們預期 pD2 = pY - 4
??????? CDerived* pD2 = static_cast<CDerived*>(pV1);
??????? printf("CDerived* pD2 = %x\n", (int)pD2);
??????? // 系統崩潰
??????? // pD2->bar();
??????? ---------------------- 輸出 ---------------------------
??????? CDerived* pD = 392fb8
??????? CBaseY* pY = 392fbc
??????? void* pV1 = 392fbc
??????? CDerived* pD2 = 392fbc
一旦我們已經轉換指針為void*,我們就不能輕易將其轉換回原類。在上面的例子中,從一個void* 返回CDerived*的唯一方法是將其轉換為CBaseY*然后再轉換為CDerived*。
但是如果我們不能確定它是CBaseY* 還是 CDerived*,這時我們不得不用dynamic_cast<> 或typeid[2]。
注釋:
1. dynamic_cast<>,從另一方面來說,可以防止一個泛型CBaseY* 被轉換到CDerived*。
2. dynamic_cast<>需要類成為多態,即包括“虛”函數,并因此而不能成為void*。
參考:
1. [MSDN] C++ Language Reference -- Casting
2. Nishant Sivakumar, Casting Basics - Use C++ casts in your VC++.NET programs
3. Juan Soulie, C++ Language Tutorial: Type Casting
posted @
2006-05-23 01:45 Jerry Cat 閱讀(433) |
評論 (0) |
編輯 收藏
WINXP服務詳解
1.Alerter
Alerter(警示器)服務的進程名是 Services.exe(即啟動這個服務后在后臺運行的進程的名稱,可以通過任務管理器看到)。Alerter服務的功能是,WinXP將系統上發生的 與管理有關的事件以警示(Alert)信息傳送至網絡上指定的電腦或用戶,例如當發生打印錯誤或硬盤即將寫滿等事件,這類警示信息由XP的警示器服務 (Alerter Service)收集、送出。
盡管Alerter依存的服務并沒有Messenger(信使)服務,但Alerter服 務必須依賴后者才能送出信息,故在啟動Alerter服務后還必須確定Messenger服務也是在工作中,而接收的電腦也必須啟動Messenger服 務。由于Alerter服務運行后,服務使用戶可以發送彈出(Pop-up)信息給其他用戶,這些信息有可能被攻擊者用來實施攻擊,如誘騙用戶修改口令 等,從而造成安全隱患。同時該服務使得用戶帳號名泄漏,也有可能被攻擊者利用來進行口令猜測攻擊。所以對于家庭單機用戶,甚至對于絕大多數小型的局域網來 說,這個功能是完全可禁用的,不僅節省了系統資源和加快啟動速度,也提高了機器的安全性。
2.Application Layer Gateway Service
簡稱"ALG"(應用層網關),其進程名是alg.exe,WinXP Home/PRO默認安裝的啟動類型為手動。ALG又被稱為代理服務器(Proxy Server),是網絡防火墻從功能面上分類的一種。當內部計算機與外部主機連結時,將由代理服務器(Proxy Server)擔任內部計算機與外部主機的連結中繼者。使用ALG的好處是隱藏內部主機的地址和防止外部不正常的連接,如果代理服務器上未安裝針對該應用 程序設計的代理程序時,任何屬于這個網絡服務的封包將完全無法通過防火墻。通俗點說,具體到ALG本身,它就是WinXP附帶的Internet連接共享 /防火墻的具體控管程序,如果你需要啟用這二者,這個服務是必備的。當然,只有一臺計算機的上網家庭可以考慮禁用這個服務,不過筆者個人覺得WinXP內 置的防火墻效果還是不錯的,如果不是堅持要使用第三方的防火墻,還是建議開著它吧。
3.Application Management
AppMgmt (應用程序管理服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型是手動,沒有任何依存服務關系。從Win2000開始微軟引入了一種基于MSI文件格式(應用程序安裝信息程序包文 件)的全新、有效軟件管理方案——即應用程序管理組件服務(Application Management),它不僅管理軟件的安裝、刪除,而且可使用此項服務修改、修復現有應用程序,監視文件復原并通過復原排除基本故障等。通常這個服務 我們保持其默認狀態較好。
可能許多朋友都有印象,當年ACDSee 4.0剛發布時,由于安裝制作上的考慮不周,并沒有考慮到那個時候大多數人的系統還并不支持MSI安裝格式,結果只得又去下載安裝一個名為Windows Installer的MSI輔助文件才解決問題。通常以MSI文件格式安裝的軟件十分好認,比如說Office XP,當你安裝后再次運行軟件的安裝程序時,它一般會有"重新安裝"、"修復軟件"、"卸載軟件"等多個選項,而不是以前安裝程序那種就簡單的卸載或覆蓋 安裝了事。
4.Automatic Updates
Wuauserv(自動更新服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型為自動,沒有任何依存服務關系。這個是大家都非常熟悉的系統自動更新功能,就不多說了。用小貓上網而深受其苦的朋友記 得在系統屬性中關閉是不夠的,還要將Automatic Updates這個服務禁用才可以。以后需要更新的話,直接到在IE中鍵入Windows Update 網站地址手動更新即可。
5.Background Intelligent Transfer Service
BITS(后臺智能傳輸服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型是手動,依賴于Remote Procedure Call、Workstation服務。微軟宣稱BITS能夠利用剩余的帶寬傳輸文件,當網絡切斷或計算機需重啟時,后臺智能傳輸服務會自動對文件傳輸加 以維護,當網絡重新連接時,后臺智能傳輸服務將繼續從停止的地方繼續開始傳輸文件。其實這個服務原是用來實現HTTP 1.1服務器之間的信息傳輸,基本上它的應用也就是支持Windows自動更新時的斷點續傳。如果你禁用了Automatic Updates,留著它基本上也沒有什么意義。
6.ClipBook
ClipSrv(剪貼板查看器服務)的進程名是 clipsrv.exe,WinXP Home/Pro默認安裝的啟動類型是手動,依賴Network DDE服務。ClipBook通過Network DDE和Network DDE DSDM提供的網絡動態數據交換服務,可查閱遠程機器中的剪貼板,通俗的說就是ClipBook支持剪貼板查看器(ClipBook Viewer)程序,該程序可允許剪貼頁被遠程計算機上的ClipBook瀏覽。
例如有個較大的文檔工程,由A、B、C共同開發,A負責 Excel數據部分,B負責Visio制圖部分,而C負責將兩部分文檔的整合。C經常需要對A、B的數據進行拷貝,愚蠢的做法是C打開A、B在網絡鄰居上 共享的文檔,然后將相關內容拷貝。而對Windows體系有一定了解的用戶應該聽說過OLE這個東西,上面說的EXCEL數據和Visio制圖都可以認為 是獨立的OLE對象,如果A、B、C的3臺機器上的Clipbook服務都為開啟,就可利用ClipBook共享這些OLE對象,C只要在自己的文檔中建 立OLE對象的鏈接指向A、B的Excel和Visio,A、B對自己工作的任何改動即可在C的復合文檔里自動體現。由此可見,ClipBook是基于對 象的共享,而非簡單的文件共享。所以也很好理解,這是一把雙刃劍,在帶來極大方便的同時,也帶來被非法遠程訪問ClipBook剪貼頁面的安全隱患。對于 沒有上述類似工作,又不準備使用或極少使用遠程桌面的用戶,這個服務完全可以禁用,在需要的時候再打開。
7.COM+ Event System
EventSystem (COM+事件系統服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型是手動,依賴Remote Procedure Call服務。對于非軟件開發專業的朋友來說,COM+是個非常難理解的名詞。簡單的說COM+是一種軟件構件/組件的標準。比如寫一個軟件好比是蓋一座 房子。而門窗等部件會根據標準設計,以求得省時省力,COM組件即是Windows的門窗等標準組件了,COM+是對COM的進一步擴展,其具體含義在此 就不詳細介紹了,Windows系統又是個典型的消息(事件)處理型系統,很多功能都是由消息來觸發的,這就產生了COM+ Event System。我們要學習的是如何簡單判斷自己的系統中是否有程序依靠此服務。檢查你的系統安裝盤下的"Program files\ComPlus Applications "目錄,如果沒有東西就可以把這個服務關閉了。
8.COM+ System Application
COMSysApp(COM+系統應用服務)的進程名是Dllhost.exe,WinXP Home/Pro默認安裝的啟動類型是手動,依賴Remote Procedure Call服務。簡單的說,COM+ System Application是COM+ Event System的具體執行者,如果禁用了COM+ Event System也就自然禁用它。
9.Computer Browser
Browser(計算機瀏覽器服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型是自動,依賴Server和Workstation服務。Browser服務維護著一個網絡資源的清單,其中包括基于 Windows的域、工作組和計算機,還有其他支持NetBIOS協議的網絡設備,我們在"網上鄰居"上看到顯示的內容正是來源于此。顯然對于一般家庭用 的計算機這個服務并不需要,除非計算機位于局域網之上,例如用長城寬帶的朋友,用它可方便地知道社區內的網絡環境。這個服務還是慎重對待較好,若不是太在 意還是將其設置成自動吧。
10.Cryptographic services
CryptSvc(認證服務)的進程名是 Svchost.exe,WinXP Home/Pro默認安裝的啟動類型為自動,依賴Remote Procedure Call服務。CryptSvc是整個微軟公鑰體系(PKI,Public Key Infrastructure)的核心元件。所謂的PK是一種公匙加密法,通過加密來保證數據的安全和傳送,它與傳統的秘密(對稱)鑰匙密碼法不相同, PK密碼法的基本特性是加密和解密的鑰匙不同,每一個用戶兩把鑰匙,一把公開密匙,一把私匙。撇開這些難以一下子理解的術語,具體到CryptSvc本身 來說,如果我們在WinXP中使用Automatic Updates自動更新,或在Internet上使用證書進行身份驗證以及正確管理這些證書等,那么這個服務就不要關閉。其中這個功能最有用的是,當你安 裝一個驅動程序時,以確定它是不是通過微軟認證的。因為驅動程序在操作系統內可以獲得很高的運行權限,含有惡意代碼的驅動程序會讓你玩完,因而開發驅動程 序的廠家一般都會去做微軟認證,通過驗證后,微軟會在里面添加它的認證數據,再到你機器上安裝時就可以通過CryptSvc檢測升級。
11.DHCP Client
Dhcp(DHCP客戶端服務)的進程名是 Svchost.exe,WinXP Home/Pro默認安裝的啟動類型為自動,依賴AFD Networking Support Environment、NetBIOS over TCP/IP以及TCP/IP Protocol Driver服務。簡單的說DHCP過程就是由網絡中一臺主機(DHCP Server)將所有的網絡參數自動分配給網絡內的任何一臺計算機,而DHCP Client就是網絡中被分配網絡參數的對象計算機了。如果能在網絡中被自動分配IP地址等網絡參數,那么這個DHCP Client服務就必不可少。對于家庭單機用戶來說,只要是使用DSL/Cable上網、開啟ICS和IPSEC服務的人都需要這個來指定靜態IP,所以 通常這個服務是不關閉的,除非你的機器是完全的單機應用環境。
12.Distributed Link Tracking Client
TrkWks(分布式連結追蹤客戶端服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型為自動,依賴Remote Procedure Call服務。對于計算機有一定了解的人對于"分布式"這個詞并不陌生,這里就不作解釋。TrkWks服務簡單說,就是將整個網絡中分散于各臺計算機上互 相有連接的NTFS文件看作一個整體,相當于一臺機器上的文件系統,所以當系統內發生文件移動,就會記錄這個信息。它是針對"域用戶"的"NTFS文件" 的"分布式連接",這3個條件缺一個你就用不上它,對于不在局域網的單機用戶來說,當然是禁用它。
13.Distributed Transaction coordinator
MSDTC(分布式交易協調器)的進程名是Msdtc.exe,WinXP Home/Pro默認安裝的啟動類型是手動,依賴Remote Procedure Call和Security Accounts Manager服務。MSDTC主要用來處理分布式交易,所謂分布式交易,就是跨越兩個或多個數據庫的單一SQL Server內部的交易。同一數據庫內不同數據表間的交易,則不能稱作分布式交易。顯然對于需要同時處理多個數據庫或文件系統的用戶來說,這個服務意義重 大,但它也是通常意義上一般用戶不會使用到的服務,通常來默認手動啟動就好了,其實這個服務也容易受到遠程拒絕服務攻擊,禁用它也沒有問題,而且更安全。
14.DNS Client
Dnscache(DNS客戶端服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型為自動,依賴TCP/IP Protocol Driver服務。DNS(Domain Name System)也是常見的名詞了,簡單的解釋就是當使用網頁瀏覽器去上網時,會鍵入網站的網址,而這些網址名稱在因特網上就是透過網域名稱服務器(DNS 服務器)來完成名稱轉換為IP地址的解釋。實際上一些網站并不是只有一臺服務器在工作,而是有多臺服務器在同時工作,也就是說同樣一個網站名稱地址可對應 不同的IP地址(在Win2000以前的操作系統可執行此查詢)。但如果將操作系統換到Win2000或XP,同樣的網站你又會發現總是查到同一個IP地 址。為什么會這樣呢?這就是DNS Client服務的作用。
為了要達到用最快速、最有效率的方式,讓客戶端能夠迅速找到網域的驗證服務,在Win2000/XP系統中,加入了DNS快取(Cache)的功能,當第 一次在找到了目的主機的IP地址后,操作系統就會將所查詢到的名稱及IP地址記錄在本機的DNS快取緩沖區中,下次客戶端還需要再查詢時,就不需要到 DNS服務器上查詢,而直接使用本機DNS Cache中的數據即可,所以你查詢的結果始終是同一IP地址。這個服務關閉與否影響并不大,在安全性上最多只是可以泄漏你的緩存內容,確定你曾經訪問過 的網站。
15.Error Reporting Service
ERSvc(錯誤報告服務)的進程名是Svchost.exe,WinXP Home/Pro默認安裝的啟動類型為自動,依賴Remote Procedure Call服務。這個服務我們經常碰到,當使用程序出錯時會跳出對話框,問你是否需要向微軟發送報告,就是這個服務的功能。此服務完全可設置為手動或禁止。 如果你想對錯誤報告進行更詳細的設置,可以右鍵單擊"我的電腦"圖標,選擇"屬性",在"高級選項卡"下點擊"錯誤報告"按鈕,在那里你可以決定是否發送 錯誤報告以及發送怎樣的錯誤報告。而對于沒有上網的用戶就可直接禁用此服務了,上網用戶如果擔心報告會向微軟透漏你的私人信息(當然微軟保證不會發生這種 事情),也大可禁用它。
16.Event Log
Eventlog(系統日志紀錄服務)的進程名是 Services.exe,WinXP Home/Pro默認安裝的啟動類型為自動,沒有服務依存關系。Event Log服務負責記錄來自系統和運行中程序的管理事件消息,為Windows和應用程序提供了一個標準而集中的方法來記錄重要的軟件和硬件事件。打開事件查 看器的方法是依次打開"開始→控制面板",然后選擇打開"管理工具→事件查看器"。這個服務是基礎服務,無法調整關閉。
17.Fast User Switching Compatibility
Fast User Switching Compatibility(多用戶快速切換服務)的進程名是svchost.exe,WinXP Home/Pro默認安裝的啟動類型是手動,依賴Terminal Services服務。此服務是WinXP的新技術,即快速的多用戶切換環境。解決了以前的多用戶環境雖然安全但是切換用戶環境需要重新啟動,并丟失上一 用戶工作環境的問題。使用很簡單,只要進行"開始→注銷→切換用戶"操作即可方便地切換用戶環境,是非常不錯的多用戶技術,如果用不著多用戶環境就不用打 開它(加入域后默認不能進行快速切換,當然可禁用)。
18.FAX Service
FAX(傳真服務)的進程名是 Fxssvc.exe,WinXP Home/Pro中默認是沒有安裝的,依賴Plug and Play、Print Spooler、Remote Procedure Call、Telephony服務。FAX服務在默認情況下是沒有安裝的,但如果你安裝了它就可以進行"開始→所有程序→附件→通訊→傳真"操作,使用 WinXP內置的傳真服務來收發傳真了,當然你要保證你的機器至少還保留了一只小貓。不需要的人就禁用吧。?
19.Help and Support
Helpsvc (幫助服務)的進程名是Svchost.exe,WinXP Home/Pro中默認安裝的啟動類型為自動,依賴Remote Procedure Call服務。這個服務用于支持WinXP幫助和支持中心的功能,如果你剛開始使用WinXP,這個幫助中心能解決不少問題,如果你覺得不需要它了,那就 禁用吧。
20.Human Interface Device Access
HidServ(人性化接口裝置服務)的進程名是 Svchost.exe,WinXP Home/Pro中默認安裝的啟動類型是禁用,依賴Remote Procedure Call服務。這個服務簡單說就是支持那些所謂的帶有多媒體功能智能鍵盤,比如音量調節。當然你有符合人體工程學標準的設備(主要指鍵盤和鼠標),那么這 個服務就設置為自動,否則這些設備的一些功能將不能正常使用。而如果你沒有這類設備或者你的設備有自己的驅動,即可禁用此服務。
21.IMAPI CD-Burning COM Service
ImapiService(IMAPI CD刻錄服務)的進程名是Imapi.exe,WinXP Home/Pro中默認安裝的啟動類型是手動,沒有任何的服務依存關系。這個就是WinXP內置的CD刻錄服務了,雜志2003年第12期對此有過較詳細 的介紹。總的來說該服務的功能和性能十分有限,有刻錄機的朋友還是安裝成熟的第三方刻錄軟件,關閉這個服務吧。
22.Indexing Service
Cisvc (索引服務)的進程名是Cisvc.exe,WinXP Home/Pro中默認安裝的啟動類型是手動,依賴Remote Procedure Call服務。這個服務可為本地和遠程計算機上的文件編制索引,也就是說像圖書館里為圖書編制的查詢索引一樣,這樣可加快尋找文件的速度。開啟此項服務對 個人用戶而言有一個很大的幫助,就是文件瀏覽速度(即雙擊某文件夾后的等待時間)會明顯增加,因為系統已將目錄結構讀入了內存,需要時會直接調用。但此服 務啟用后某此情況會導致系統極度繁忙,通過任務管理器,可看見Cidaemon.exe這個進程占用了大部分CPU資源。因此對待這個不成熟的服務請根據 自己機器的情況設為"自動"或"禁用"。
23.Internet Connection Firewall/Internet Connection Sharing
SharedAccess (Internet連接共享和防火墻服務)的進程名是Svchost.exe,WinXP Home/Pro中默認安裝的啟動類型分別是手動和自動,依賴Application Layer Gateway Service、Network Connections、Network Location Awareness、Remote Access Connection Manager服務。這個服務提供WinXP內置的Internet連接共享和防火墻功能。筆者比較喜歡這兩個功能,性能都不錯而且方便,具體關閉與否看 個人喜好,不用就可以關閉它。
24.IPSEC Services
PolicyAgent(IP安全策略服務)的進程名是 Lsass.exe,WinXP Home/Pro中默認安裝的啟動類型為自動,依賴IPSEC driver、Remote Procedure Call、TCP/IP Protocol Driver服務。IPSEC是一種用來保護內部網、專用網絡以及外部網(Internet、Extranet)免遭攻擊的重要防御方法,主要特征在于它 可對所有IP級的通信進行加密和認證,正是這一點才使IPSEC可以確保包括遠程登錄、客戶/服務器、電子郵件、文件傳輸及Web訪問在內的多種應用程序 的安全。由于企業及政府用戶非常注重于部署安全的IP,所以這一服務顯得很重要。同時也可以看到,對于絕大多數用戶來說,這是個根本就不用關心的東西。所 以禁用它吧。
25.Logical Disk Manager
Dmserver(邏輯磁盤管理員服務)的進程名是Svchost.exe,WinXP Home/Pro中默認安裝的啟動類型分別是手動和自動,依賴Plug and Play、Remote Procedure Call服務。Dmserver用來動態管理磁盤,如顯示磁盤可用空間和使用Microsoft Management Console(MMC)主控臺中的磁盤管理功能。這個服務對于經常使用移動硬盤、U盤等外設的朋友來說必不可少,沒有的話可選擇禁用它。
26.Logical Disk Manager Administrative Service
? Dmadmin(邏輯磁盤管理系統管理服務)的進程名是Svchost.exe,WinXP Home/Pro中默認安裝的啟動類型分別是手動和自動,依賴Logical Disk Manager、Plug and Play、Remote Procedure Call服務。Dmadmin主要用來配置硬盤信息,平時基本上沒用。打開"計算機管理"(Microsoft Management Console,簡稱MMC)時,你可以看到"磁盤管理",這時就會用上它,可設為手動。
27.Messenger
Messenger (信使服務)的進程名是Services.exe,WinXP Home/Pro中默認安裝的啟動類型為自動,依賴NetBIOS Interface、Plug and Play、Remote Procedure Call、Workstation服務。Messenger這個服務上過網的人都應該比較熟悉,本來Microsoft開發"信使服務"是為了方便同一域 中的管理員進行信息交流,后來有些人開發了突破域限制的信使發送工具,于是大家掛在網上時,計算機上經常會彈出一個名為"信使服務"的對話框,這些不請自 到的"信使"基本上是一些垃圾信使信息,有無聊的廣告,有非法的信息等。通常這些信息是用一些名為"兇寶寶信使"、"妖刺"的軟件發布的,但實際上如果是 在同一域中,只需要用NET SEND命令就可以輕易發送消息了。突然出現的"信使服務"不僅會干擾工作,影響心情,而且還容易遭到"社會工程"攻擊,所以禁用它吧。
28.MS Software Shadow Copy Provider
SwPrv(管理磁盤區卷影復制服務)的進程名是dllhost.exe,WinXP Home/Pro中默認安裝的啟動類型是手動,依賴Remote Procedure Call服務。這個服務是為WinXP中的MS Backup備份程序提供支持,奇怪的是即使關掉它我的備份工作也可以順利完成,用不著的話就禁用它吧。
29.Net Logon
Netlogon(網域登錄服務)的進程名是lsass.exe,WinXP Home/Pro中默認安裝的啟動類型分別是手動和自動,依賴Workstation服務。這個服務是用來做網域審查的。當你的計算機處在一個域網內時, 如果要使用網內的域服務器登錄到域網時,就要通過它來登錄了。一般用戶用不著,禁用即可。
30.NetMeeting Remote Desktop Sharing
Mnmsrvc (NetMeeting遠程桌面共享服務)的進程名是Mnmsrvc.exe,WinXP Home/Pro中默認安裝的啟動類型是手動,依賴Remote Procedure Call服務。使用NetMeeting可透過公司內部網絡,讓使用者將計算機的控制權分享給局域網上或因特網上的其他使用者,很多人都因為安全問題關掉 它,而且它很占網絡資源。但如果你想和別人做些非文字的交流,還是比較好玩的。注意關掉它后,遠程桌面共享功能將無法使用。
31.Network Connections
Netman(網絡連接服務)的進程名是svchost.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。Netman也是非常重要的基礎服務,它管理著"網絡和撥號連接"文件夾中的所有對象,任何有關于網絡上(局域網、Internet)的連 接都需要這個服務。如果被禁用,在"網絡和撥號連接"文件夾中將什么都看不到,更不用說新建連接和撥號上網了。因此除非你的機器是絕對的單機環境,才可將 其關閉。
32.Network DDE
NetDDE(網絡動態數據交換服務)的進程名是netdde.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于Network DDE DSDM服務。NetDDE(Network Dynamic Data Exchange)是微軟早期設計的一種方法,可讓應用程序在不同PC上的Windows之間交換動態數據,現在已經很少使用。實際上在WinXP中,真 正使用它的只有ClipBook服務,回顧上一期中提到的3人共同開發文檔,通過ClipBook來交換動態數據的例子就可以很好理解這個服務的作用了。 數據共享服務通常是經過可信賴的溝通渠道,負責管理這項服務的是網絡DDE代理(Network DDE Agent),實際上網絡DDE代理會使機器非常容易遭受攻擊而失去本機的管理員控制權。因此如果無需ClipBook共享這個特殊服務,不妨禁用。
33.Network DDE DSDM
NetDDE dsdm(網絡動態數據交換網絡共享服務)的進程名是netdde.exe,WinXP Home/PRO默認安裝的啟動類型是手動,它不依賴于其他服務。如果此服務終止,Network DDE服務將不可用,實際上如果不用Network DDE,那么Network DDE DSDM也禁用好了。
34.Network Location Awareness
NLA (網絡位置識別服務)的進程名是svchost.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于AFD網絡支持環境和TCP/IP Protocol Driver服務,而ICF/ICS服務依賴于它。NLA可以探測網絡系統的相關信息,當這些信息發生變化時通知相關的應用程序。基本上,這個服務主要針 對的對象是筆記本電腦。因為在實際工作和生活中,人們的筆記本電腦常常在超過一個以上的網絡環境中應用。經常可能遇到在一個網絡中需要使用動態IP地址, 而在另一網絡中需要使用靜態IP地址的問題。比如說你在辦公室里使用的是動態IP,而在家里卻使用靜態IP來連接寬帶,那么NLA就可讓你在家里及單位網 絡(有線)之間切換時自動辨認出不同網絡環境,從而自動選擇合適的配置而無需重新調整網絡參數。對于經常移動辦公的人,這確實是個不錯的功能。
35.NT LM Security Support Provider
NtLmSsp (NT LM安全性支持提供者服務)的進程名是lsass.exe,WinXP Home/PRO默認安裝的啟動類型是手動,它不依賴于其他服務。NT LM的意思即NT LanManger,是NT下提供的認證方法之一,使用了64位的加密手段。NtLmSsp這個服務主要針對RPC(遠程過程調用),通常RPC可以選擇 基于兩種通信方式,一種是傳輸協議,比如TCP/IP、UDP、IPX等,另一種為命名管道(Pipeline)。通常情況下Windows默認選擇都是 傳輸協議,而由于RPC是采用非加密傳輸的,通信數據安全無法得到保證,而NtLmSsp就可向這一類RPC提供安全服務。WinXP中已知的這類RPC 應用就是Telnet服務(Telnet也依賴于NtLmSsp),因此無需Telnet服務的單機用戶可將NtLmSsp其關閉。
36.Performance Logs and Alerts
SysmonLog (效能記錄日志及警示服務)的進程名是smlogsvc.exe,WinXP Home/PRO默認安裝的啟動類型是手動,它沒有任何服務依存關系。如果打開控制面板的管理工具,可以看到有"性能"這個工具,它較詳細地反映了系統的 性能,但配置起來相當復雜,不好上手,而且大多數人也會認為這個性能工具沒什么意義。
SysmonLog就是為它提供日志記錄的服務。如果 你對自己機器的工作狀態比較在意,這絕對是一個值得研究的工具,因為它可以嚴格監視硬盤、內存、CPU甚至于軟件在系統中的運行,并通過記錄下的日志數據 分析機器軟硬件資源的具體情況。更有用的是,如果你比較了解計數器這個參數的設置,就可為各部分資源設置合適的計數器值,一旦服務監視到資源的性能值超過 或是低于此值,就會通過Messenger服務發出警告,如此很容易就能覺察到機器的某部分資源不足(如若升級電腦就可先從這里考慮)或發生了故障等。當 然,并不關心自己機器具體工作的用戶也可將其關閉。
37.Plug and Play
PlugPlay(即插即用服務)的進程名是services.exe,WinXP Home/PRO默認安裝的啟動類型是自動,它不依賴于任何服務。這個服務想必大家相當熟悉,從Win98開始這個技術就始終是微軟操作系統的核心部分。 即插即用是Intel開發的一組規范,它賦予了計算機自動檢測和配置設備并安裝相應驅動程序的能力,當有設備被更改時能自動通知當前設備的狀況并使用該設 備變更后的程序。PlugPlay是WinXP的幾個基礎服務之一,在服務管理工具中無法調整它,而且如果本服務一旦失敗就只有重新啟動機器了。
38.Portable Media Serial Number Service
WmdmPmSp(便攜的媒體序號服務)的進程名是svchost.exe,WinXP Home/PRO默認安裝的啟動類型是自動,它沒有任何服務依存關系。這個服務其實非常簡單,它是微軟用來防盜版的工具之一,但目前基本上只是針對音樂。 微軟用它獲得你系統中媒體播放器的序列號,做什么用呢?其實它是在試圖控制你將盜版的音樂文件拷貝到類似MP3、MD等便攜播放器上。盡管微軟聲稱關掉這 個服務會影響將正版音樂下載到便攜播放器,但筆者還是關掉這個服務,一是影響并不大,至少手上的正版CD拷貝到MP3是沒有問題的,二是微軟也刺探得太多 了吧,我們用什么還都得報告它?
39.Print Spooler
Spooler(打印后臺處理服務)的進程名是 spoolsv.exe,WinXP Home/PRO默認安裝的啟動類型是自動,依賴于Remote Procedure Call。Spooler是為了提高文件打印效率,將多個請求打印的文檔統一進行保存和管理,先將要打印的文件拷貝到內存,待打印機空閑后,再將數據送往 打印機處理。這樣處理速度更快些。建議將其設置為手動,有打印任務時再打開。如果沒有打印機自然是禁用了。
40.Protected Storage
ProtectedStorage (受保護存放區服務)的進程名是lsass.exe,WinXP Home/PRO默認安裝的啟動類型是自動,依賴于Remote Procedure Call。這一服務提供對敏感性數據保護的功能,比如密碼、證書等,但通常它只針對Windows自身的敏感數據進行保護,可用來儲存你計算機上的密碼。 通常上網的用戶都比較喜歡開這個服務,畢竟像自動填表這些功能給人帶來不少方便。但如果你的電腦是多用戶環境,或是使用筆記本電腦,經常移動辦公,那么這 個服務就要謹慎使用了。有不少密碼破解軟件就是針對這個ProtectedStorage的,比較有名的有Protected Storage PassView,用它可以輕易得到被儲存在ProtectedStorage中你曾經上過的論壇的帳號密碼、撥號密碼等。因此,對于這個服務要視使用環 境而定,在不安全的環境下還是關閉較好。
41.QoS RSVP
RSVP(QoS 許可控制服務)的進程名是rsvp.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于AFD Networking Support Environment、Remote Procedure Call、TCP/IP Protocol Driver服務。這就是微軟那個飽受爭議的占用了20%網絡帶寬的服務了。對大多數朋友來說,關掉它是簡單正確的選擇。但是要理解這個服務究竟是干什么 的就不這么簡單了。QoS這個詞的意思是服務質量(Quality of Service),而RSVP這個詞的意思是資源預留協議(ReSerVation Protocol)。
隨著IP技術和網絡的發展,世界 各國的運營商基于IP網絡已開發出多種多樣的新業務。由于目前基于存儲轉發機制的Internet(IPv4標準)只為用戶提供了"盡力而為(best- effort)"的服務,不能保證數據包傳輸的實時性、完整性以及到達的順序性,更無法保障實時多媒體業務服務質量(QoS),所以主要應用在文件傳送和 電子郵件服務。而隨著Internet的飛速發展,人們對于在Internet上傳輸多媒體信息的需求越來越大,這就要求網絡應能根據用戶的要求分配和調 度資源,傳統的"盡力而為"轉發機制已不能滿足用戶的要求。為解決這一問題,美國于1996年底開始了以提高網絡服務質量研究為核心的InternetⅡ 以及NGI(下一代Internet)等研究項目。相關的權威組織IETF(Internet Engineering Task Force)也成立了專門的工作小組來研究多媒體服務質量的定義和相關標準。IETF在IP網絡的QoS方面提出了多種服務模型和機制,其中的綜合業務模 型(Int-Serv)引入了一個重要的網絡控制協議RSVP(資源預留協議),這一模型的思想是"為了給特定的客戶包流提供特殊的QoS,要求路由器必 須能夠預留資源。反過來要求路由器中有特定流的狀態信息"。所以可以看出,這一模型能提供絕對有保證的QoS,是以預留下的資源作為代價的,對資源的要求 實際上是更高的。因此,對于WinXP中的QoS RSVP服務保留了20%的網絡帶寬也就不足為奇了,由于對于個人應用幾乎毫無意義,禁用它是不二選擇。
42.Remote Access Auto Connection Manager
RasAuto (遠程訪問自動聯機管理員服務)的進程名是svchost.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于Remote Access Connection Manager、Telephony服務。RasAuto主要針對寬帶使用,當有網絡連接請求時它會自動打開網絡連接,我們在使用WinXP時會經常彈出 一個自動撥號窗口,就是它在工作。如果你的機器提供網絡共享服務就開著它,避免網絡斷線后手動連接,否則可將其關閉。?
43.Remote Access Connection Manager
RasMan(遠程訪問聯機管理員服務)的進程名是svchost.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于Telephony服務,其簡單描述是"創建網絡連接",這個解釋簡單明了,所以根據自己系統的情況來使用這個服務即可。
44.Remote Desktop Help Session Manager
RDSessMgr (遠程桌面協助服務)的進程名是sessmgr.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。這是與NetMeeting Remote Desktop Sharing很類似的一個服務。鼠標點擊"開始→所有程序→附件→通訊→遠程桌面連接"可開遠程桌面功能,而RDSessMgr就是為它提供支持。微軟 的原意是通過它做遠程幫助,其代價是犧牲安全與4MB內存的占用,不需要時一定得關閉。
45.Remote Procedure Call
RpcSs (遠程過程調用服務)的進程名是svchost.exe,WinXP Home/PRO默認安裝的啟動類型是自動。太多服務依賴于這一服務了,最近"沖擊波"橫行,恐怕大家都對RPC有此印象了吧,它原名遠程進程調用,是早 期IBM、SUN等公司定義的功能級通信協議,隨后被微軟采納,但作了改動,稱之為MRPC。總的來說RPC是一種消息傳遞功能,上一期說過 Windows系統是個典型的消息(事件)處理型系統,所以RPC對于系統的重要性不言而喻。由于Windows內部結構已相當復雜了,很難搞清楚哪些模 塊在用RPC哪些不用,事實上你只要關掉它,系統就可能崩潰。所以這個服務也是不可禁用的。
46.Remote Procedure Call(RPC)Locator
RpcLocator (遠程過程調用定位服務)的進程名是locator.exe,WinXP Home/PRO默認安裝的啟動類型是手動,依賴于Workstation服務。這一服務和上面的RPC服務并無太多關系,是用來給RPC的命名服務的。 其用途簡單解釋就是,通過它對RPC的命名管理,調用者才能找到被調用者的位置。但由于微軟系統注冊表的存在,使得這些命名服務在本機上的調用上毫無意 義。因此對于一般用戶完全可以關閉。
47.Remote Registry
RemoteRegistry(遠程注冊表服務)的進 程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默認安裝的啟動類型是自動,依賴于Remote Procedure Call服務。此服務是向其他連機的計算機開放你的注冊表,微軟總是讓這種明顯是安全隱患的服務自動啟動實在讓人費解。不過如果你有這種特殊需求的話可以 嘗試一下。打開注冊表編輯器Regedit,在文件菜單欄里找到"連接網絡注冊表"這一項,可讓你打開甚至編輯其他機器上的注冊表。當然那些機器上的 RemoteRegistry也必須是打開的,而且對你計算機的一些相應權限同樣必須開放。
48.Removable Storage
NtmsSvc (卸除式存放裝置服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。此服務的名稱太容易讓人誤解,實際上它只是對特殊可移動存儲器的管理,比如ZIP軟驅和磁帶驅動器,不要擔心你的CD和DVD等設備。從事 圖像設計的用戶經常會用ZIP同蘋果機交換文件,一般人恐怕很少使用這些特殊設備,因此可將其關閉。
49.Routing and Remote Access
RemoteAccess (路由和遠程訪問服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型分別為禁用和手動,依賴于NetBIOSGroup、Remote Procedure Call服務。Routing and Remote Access為軟路由,即在一臺連接多個網絡的計算機上通過運行路由軟件,以實現網絡間路由的一種方法,相對于硬件路由來說很是方便經濟。WinXP也把 這個功能集成到系統里來了,不過可能比較少人知道是在哪里配置路由,主要原因就是這個服務默認為關閉。首先啟動此服務,網絡連接文件夾里會多出一個"傳入 的連接",值得注意的是,在VPN連接(傳入的連接)的屬性"Internet協議(TCP/IP)"里一般要指定TCP/IP地址(一般來說都必須是合 法地址)才行。感興趣的朋友可以自己繼續研究,而大多數不需要的朋友直接禁用它吧。
50.Secondary Logon
Seclogon (二次登錄服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,沒有任何服務依存關系。這個服務對應于用戶臨時權限分配功能,在多用戶使用的計算機上,某些用戶因為是非管 理員權限,導致某些程序無法執行。為了讓沒有管理員權限的已經登錄用戶可以使用這些程序,WinXP設計了這個功能來分配臨時的管理員權限。打開這個服務 后,右鍵點擊鼠標選擇"運行方式"將會出現對話框,讓你選擇執行這個程序的用戶身份。對多用戶環境下的管理員,這確實是方便的功能,不過依然是以安全作為 代價的,對單人環境的筆記本電腦用戶來說尤其無用而且危險!所以要謹慎使用。
51.Security Accounts Manager
SamSs(安全賬戶管理 服務)的進程名是lsass.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Remote Procedure Call服務。熟悉WinXP啟動過程的用戶都知道SAM文件的重要性,SamSs是負責SAM數據庫的控制和維護的服務。SAM數據庫位于注冊表 "HKLM\SAM\SAM"下,可使用Regedit32.exe打開注冊表編輯器,并設置適當權限查看SAM中的內容。SAM數據庫保存在磁盤上的" 系統盤\windows\system32\config"目錄下的sam文件中,在這個目錄下還包括一個security文件,是安全數據庫的內容,兩 者有不少關系。SAM數據庫中包含了系統中所有組、賬戶的信息。而WinXP啟動時就需要在SAM文件中讀取諸如用戶名、用戶全名(full name)、所屬組、描述、密碼、注釋、是否可以更改密碼、密碼設置時間等信息。這也是系統中不可關閉的幾個基礎服務之一,如果服務啟動失敗,系統就只有 重啟了。
52.Server
Lanmanserver(服務器服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動。Server服務對應的是網絡上的文件/打印機器共享,以及網絡的路徑映射共享功能。沒有這些方面的需要你就可以關閉它。
53.Shell Hardware Detection
ShellHWDetection (外殼硬件探測服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Remote Procedure Call服務。對這個服務微軟是語焉不詳,也沒有給出詳細的硬件描述或列表,不過根據網絡上不少人的測試,這個服務主要還是和具有自動運行(播放)功能的 硬件有關系,例如數字相機、CD-ROM等。通過這個服務,當這些硬件接上系統或放入相應媒介時,WinXP能自動探測到并做出對應動作。對于外設越來越 多的現在,沒有把握還是不要輕易關閉它。
54.Smart Card
SCardSvr(智能卡服務)的進程名是 SCardSvr.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Plug and Play服務。Smart Card(智能卡)其外型和一般信用卡大小一樣,但多了一塊指甲大小的IC芯片后,使原本普通的一張卡片變成擁有資料控管與邏輯運算的能力。智能卡包括金 融卡、GSM卡等,與我們一般常用的電話IC卡相比,內部的IC線路設計不同。由于卡內本身即已包含了CPU功能、ROM、EEPROM、RAM等元件, 智能卡就像一臺可隨身攜帶的超微型電腦,可用來儲存及處理重要資料。在安全性方面,智能卡具有自我毀滅系統,想竊取卡上的資料非常困難。如果你擁有智能卡 及相關的讀卡設備就開啟這個服務,否則就禁用吧。
55.Smart Card Helper
SCardDrv(智能卡協助服務)的進程名是SCardSvr.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,它沒有任何服務依存關系。只要沒有相關的設備就禁用好了。
56.SSDP Discovery Service
? SSDPSRV(簡易服務發現協議之發現服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動。SSDPSRV主要用于局域網上UPnP(Universal Plug and Play,統一即插即用)設備的搜索。UPnP并不同于我們平常熟悉的PnP,UPnP技術PnP對進行了擴展,簡化了家庭或企業中智能設備的聯網過程。 UPnP規范基于TCP/IP協議和針對設備彼此間通信而制訂的其他Internet協議,這就是它之所以被稱作"通用"的原因所在-——UPnP技術不 依賴于特定的設備驅動程序,而是使用標準協議。與即插即用相比,這種技術的意義在于,能夠輕易地使家庭等非專業用戶享受到智能化技術帶來的更舒適完美的生 活,例如,正是UPnP才使得能在網上沖浪的電冰箱成為可能。UPnP是個較新的協議,也不是非常成熟,對應設備在市場上非常罕見,市場上流行的 Linksys BEFSR41W無線路由器是這方面的例子。對于大多數現在還無緣使用此類設備的朋友,關閉這個服務吧。
57.System Event Notification
SENS(系統事件通知服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于COM+ Event System服務。它的簡單描述是"跟蹤系統事件,如登錄Windows、網絡以及電源事件等。將這些事件通知給COM+事件系統‘訂閱者 (subscriber)’"。這已將服務的內容解釋得很清楚了。盡管有人認為這個服務無關緊要,事實上系統是否需要它取決于你在系統里安裝了些什么,而 許多應用程序的運行是要通過SENS來實現的,所以建議還是讓它自動打開為好。
58.System Restore Service
Srservice (系統還原服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Remote Procedure Call服務。這是大家都非常熟悉的系統還原功能了,如果不使用的話,先在"我的電腦"屬性中的系統還原選項卡關閉,然后在這里將服務禁用即可。
59.Task Scheduler
Schedule (計劃任務服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Remote Procedure Call服務。此服務支持WinXP的計劃任務,它能使程序在預定的時間自動運行,如定期進行磁盤碎片整理、病毒掃描、更新等,可根據自己的需要選擇是否 開啟。
60.TCP/IP NetBIOS Helper
LmHosts(TCP/IP NetBIOS 助手服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于AFD網絡支持環境、NetBios Over TCP/IP服務。該服務能在TCP/IP上提供NetBIOS支持。大家應該對TCP/IP比較熟悉了,相對來說NetBIOS網絡協議對讀者來說可能 比較陌生,它是由IBM開發的一個很古老的協議,當年在局域網上占據主導。由于NetBIOS不具備路由功能,也就是說它的數據包無法跨網段傳輸,因此在 廣域網、城域網大行其道的今天,它只能退居配角。其實在Win95/98的網絡協議中仍然保留著NetBIOS,不過它已經改名叫NetBEUI (NetBIOS擴展用戶接口),是NetBIOS的Microsoft改進版。由于NetBIOS是完全基于局域網的,因此作為訪問Internet資 源的一般用戶可以禁用它,除非你的系統處在小局域網中,而且使用的也正是NetBIOS協議。
61.Telephony
TapiSrv(電話服務)的進程名是 svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Plug and Play、Remote Procedure Call服務。簡單地說這個服務能為計算機提供電話撥號的能力。如果你使用了任何形式的撥號,不管是用撥號調制解調器還是DSL/Cable連接到 Internet,還是通過電話線連接其他計算機,或是撥打電腦IP電話、發傳真等,你就有必要保留這個服務,反之就可關掉它。
62.Telnet
TapiSrv(遠程登錄服務)的進程名是tlntsvr.exe,在WinXP Home下不可用,在WinXP PRO下默認安裝的啟動類型是手動,依賴于NT LM Security Support Provider、Remote Procedure Call、TCP/IP Protocol Driver服務。這是一個容易遭到誤會的服務名稱,一般人會誤以為這是以前DOS下那個Telnet,關了之后就無法使用BBS。其實它與BBS無關, 完全是微軟自己的Telnet系統,盡管兩者的原理相差不大,即讓用戶以模擬終端的方式,登錄到Internet的某臺主機上,一旦連接成功,這些個人計 算機就好像是遠程計算機的一個終端,可以像使用自己的計算機一樣輸入命令,運行遠程計算機中的程序。基于安全性理由,如果沒有特別需求,這個服務一定要關 掉禁用。
63.Terminal Services
TermService(終端機服務)的進程名是svchost.exe,在 WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。它的簡單描述是"允許多位用戶連接并控制一臺機器,并且在遠程計算機上顯示桌面和應用程序。這是遠程桌面(包括管理員的遠程桌面)、快速用 戶轉換、遠程協助和終端服務器的基礎結構"。這段描述已將該服務的用途解釋得很清楚了,需要強調的是,這些方便都是以安全為代價的,如果平時不用就一定要 關掉。
64.Themes
Themes(主題服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,沒有服務依存關系。很多人都喜歡使用XP的布景主題,不過如果用戶沒有使用就關閉好了。
65.Uninterruptible Power Supply
UPS (UPS電源管理服務)的進程名是UPS.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,沒有服務依存關系。它的簡單描述是"管理連接到計算機的不間斷電源(UPS)",同樣很好理解,UPS(不 間斷電源供應)一般用戶極少用到,除非你的電源供應器具備此功能,不然可關閉。
66.Universal Plug and Play Device Host
UPNPhost (統一即插即用驅動主機服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于SSDP Discovery Service服務。它同SSDP Discovery Service是繼承關系,后者搜索發現UPnP設備,而UPNPhost為UPnP設備提供驅動支持。當然通常情況下關閉即可。
67.Upload Manager
Uploadmgr (上傳管理服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Remote Procedure Call服務。這個服務的具體效果不明,關閉它后實際使用中的網絡上傳下載并沒有受到什么影響,也許它跟微軟的服務器和相關服務有關?請根據需要關閉。
68.Volume Shadow Copy
VSS(上傳管理服務)的進程名是vssvc.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。它的簡單描述是"管理并執行用于備份和其他目的的卷影復制",依然是和WinXP備份有關的服務,它默認就是關閉的,也并沒有在筆者的機器 上對備份造成影響,其具體應用依是未解之謎。
69.WebClient
WebClient(Web客戶端服務)的進程名是 svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于WebDav Client Redirector系統組件。使用WebDav可將檔案或數據夾上傳到某個Web服務,這個服務對于未來.NET意義更大。基于安全性的理由,現在你可 以嘗試關閉它。
70.Windows Audio
AudioSrv(Windows音頻服務)的進程名是 svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Plug and Play、Remote Procedure Call服務。理解這個服務再簡單不過了,如果你的機器沒有聲卡可以關閉它
71.Windows Image Acquisition(WIA)
Stisvc (Windows影像取得服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。該服務為控制面板中的"掃描儀和照相機"功能提供支持。通過這個功能,用戶在安裝好設備驅動后無需要再安裝相關管理軟件,就能輕易操作掃描 儀和數碼相機來獲得圖像。不需要的用戶可關閉它。
72.Windows Installer
MSIServer(Windows 安裝服務)的進程名是msiexec\.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。這一服務同Application Management服務基本是一樣的。從微軟的解釋看,Windows Installer服務應該是.MSI文件的最直接執行者。同樣讓人奇怪的是,這個服務默認就是關閉的,可.MSI文件的安裝、修復或刪除卻很正常,和備 份工具一樣,究竟這個服務在系統中扮演什么角色,如何工作,只有微軟的工程師才知道了。
73.Windows Time
W32Time(Windows時間服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,它沒有服務依存關系。這一服務對應WinXP的Internet對時服務,如不需要關閉即可。
74.Windows Management Instrumentation(WMI)
Winmgmt (Windows管理規范服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于Event Log、Remote Procedure Call服務。WMI是Windows中的基礎管理結構,它通過一組常用接口來控制和監視系統(如對系統屬性的查看與更改、設置用戶權限等)。WMI為訪 問大量的Windows管理數據提供了一個統一的機制。WMI通過腳本、C++程序接口、.NET類(系統管理)和命令行工具(WMIC)提供了對信息的 訪問。WMI的功能還包括事件、遠程、查詢、查看、計劃和實施用戶擴展及更多內容。總而言之,雖然在服務管理工具中可以關閉,但最好別動它,否則會出現許 多莫名的問題。
75.Windows Management Instrumentation Driver Extensions
Wmi (Windows管理規范驅動延伸服務)的進程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默認安裝的啟動類型是手動,沒有服務依存關系。微軟的白皮書介紹,該服務是作為WMI服務在驅動程序方面的一個延伸,簡單說主要就是為讓系統方便 地獲知計算機中OEMs(original equipment manufacturers)以及IHVs(independent hardware vendors)等與硬件廠商相關的硬件信息。不過讓人奇怪的是,為什么它在WinXP Home下不可用呢?
76.Wireless Zero Configuration
WZCSVC (無線配置服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,依賴于NDIS Usermode I/O Protocol組件、Remote Procedure Call服務。它的簡單描述是"為您的802.11適配器提供自動配置"。802.11是大家都比較熟悉的無線局域網協議標準了,其已經在市場上占據了優 勢。當然,802.11協議、藍牙標準和HomeRF工業標準是無線局域網所有標準中最主要的競爭對手,它們也各有優劣。然而802.11b無線局域網技 術已經在美國得到了廣泛的應用,所以微軟的WinXP內置服務支持也就不足為奇了。如果你沒有使用無線網絡適配卡裝置,那么可以關閉服務。
77.WMI Performance Adapter
WmiApSrv (WMI性能適配器服務)的進程名是wmiapsrv.exe,在WinXP Home/PRO下默認安裝的啟動類型是手動,依賴于Remote Procedure Call服務。此服務提供了從WMI HiPerf 提供者獲得的性能庫信息,需要以手動方式進行配置,并不會在缺省狀態下實現運行。該服務太過專業,無法解釋得淺顯,對于普通的使用者最好保持其默認狀態。
78.Workstation
Lanmanworkstation(工作站服務)的進程名是svchost.exe,在WinXP Home/PRO下默認安裝的啟動類型是自動,它不依賴于其他服務,但有不少服務都依賴它。該服務同樣為基礎服務,請保持其默認狀態不要關閉.
posted @
2006-05-21 03:01 Jerry Cat 閱讀(1062) |
評論 (1) |
編輯 收藏
Windows憑據管理
原文:http://www.shnenglu.com/Squirrel/archive/2006/05/20/7445.html
??????
題目中的Windows憑據(Credential)其實就是指用戶帳戶和口令。最近項目中存在一臺Windows(PC)機去管理服務器(Server),這之中就設計到服務器管理員權限的問題。需要用戶對Windows上存儲的用戶名和密碼進行管理。
?????? 在Windows XP和Server 2003 中都已存在了“存儲的用戶名和密碼”。在XP中,通過控制面板中的用戶帳戶-〉選擇用戶-〉管理我的網絡密碼。而在Server 2003中,則在控制面板下直接有“存儲的用戶名和密碼”項。
?????? 我們調用一些API,如WTSOpenServer,QueryServiceStatus,NetUserEnum等等涉及到RPC的,只要當前用戶存儲有目標遠程機的權限合適的憑據,則這些API就不會因產生ERROR_ACCESS_DENIED而執行失敗。因為我還不Windows的底層是如何進行控制的,比如,是否調用了SSPI,所以,執行這些API時,我只能向用戶要管理員口令。但又不可能每次都讓用戶去輸入一遍用戶名和密碼,那么,也就需要保存密碼。
????? ?既然保存了密碼,就必須考慮刪除密碼,那么密碼管理的問題也就來了。說到密碼管理,我在前些年看電視的時候,看到介紹一個叫什么“網絡螃蟹”的網站,他就是專門提供個人密碼管理的,當時我就想,有人會去把自己的密碼交給別人打理嗎?這好像不大可能。后來也就沒聽到什么網絡螃蟹橫行的消息。
?????? 現在我的項目中,如果用戶有了一臺機器(PC)的密碼,那么,他就有了N臺服務器的管理員權限。這當然是不被允許的了。怎么辦?
?????? 找了一些API,是Authentication Functions系列的。于是,下面一個小實驗代碼就是想來枚舉用戶憑據的。
#include?<windows.h>
#include?<WinCred.h>

int?main()
{

??DWORD?dwCount?=?0;
??PCREDENTIAL?*?pCredArray?=?NULL?;


??if(?CredEnumerate(?NULL,?0,?&dwCount,?&pCredArray?)?)
{


????for(?DWORD?dwIndex?=?0;?dwIndex?<?dwCount;?dwIndex++)
{
??????PCREDENTIAL?pCredential?=?pCredArray[dwIndex];

??????cout?<<?"*********************************\r\n";

??????cout<<??"Flags:?"?<<?pCredential->Flags?<<?"\n"
??????????<<??"Type:??"?<<??pCredential->Type?<<?"\n"
??????????<<??"Name:??"?<<?pCredential->TargetName?<<?"\n"
??????????<<??"Persist:?"<<?pCredential->Persist??<<??"\n"
??????????<<??"User:??"?<<??pCredential->UserName?<<??"\n";

??????cout?<<?"Data:??\r\n";

??????char?szHexBuffer[256]?=?"";
??????char?szAsciiBuffer[256]?=?"";
??????char?szHex[16];
??????char?szAscii[2];
??????DWORD?dwByte;

??????for?(dwByte?=?0;?dwByte?<?pCredential->CredentialBlobSize;?dwByte++)

??????
{
????????BYTE?byte1?=?pCredential->CredentialBlob[dwByte];
????????sprintf(szHex,?"%2.2X?",?byte1);
????????szAscii[1]?=?'\0';

????????if?(byte1?>=?32?&&?byte1?<?128)
??????????szAscii[0]?=?(UCHAR)byte1;
????????else
??????????szAscii[0]?=?'?';

????????strcat(szHexBuffer,?szHex);
????????strcat(szAsciiBuffer,?szAscii);

????????if?(dwByte?==?pCredential->CredentialBlobSize?-?1?
??????????||?dwByte?%?16?==?15)

????????
{
??????????printf("%-50s?%s\r\n",?szHexBuffer,?szAsciiBuffer);
??????????szHexBuffer[0]?=?'\0';
??????????szAsciiBuffer[0]?=?'\0';
????????}

??????}

??????cout?<<?"*********************************\r\n";

????}

????CredFree(?pCredArray?);
??}
??//system(?"rundll32?keymgr.dll,KRShowKeyMgr");
??return?0;
}?????
好像憑據數據還沒能打出來。
?????? 后來,本著“編程的最高境界就是不編程”的精神,我想,如果直接把Windows的那個“存儲的用戶名和密碼”對話框調出來用用不也可以嗎。用ProcessExplorer,找到一個叫keymgr.dll的東西,嗯,估計對話框就在里面。
?????? 在“運行”中輸入“control keymgr.dll”或“rundll32 keymgr.dll,KRShowKeyMgr”,對話框就出來了。
?????? 又省事了!
posted @
2006-05-21 02:43 Jerry Cat 閱讀(754) |
評論 (0) |
編輯 收藏
/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/
[譯著]在模板方法中的一些"反常"用法
作者: Jerry Cat
時間: 2006/05/19
鏈接:?
http://www.shnenglu.com/jerysun0818/archive/2006/05/19/7393.html
-------------------------------------
I. Virtually Yours -- Template Method模式
我在研究Wendy寫的一個類。那是她為這個項目寫的一個抽象基類,而我的工作就是從中派生出一個具象類(concrete class)。這個類的public部分是這樣的:
class Mountie {
public:
??? void read( std::istream & );
??? void write( std::ostream & ) const;
??? virtual ~Mountie();
很正常,virtual destructor表明這個類打算被繼承。那么再看看其protected部分:
protected:
??? virtual void do_read( std::istream & );
??? virtual void do_write( std::ostream & ) const;
也不過就是一會兒的功夫,我識破了Wendy的把戲:她在使用template method模式。public成員函數read和write是非虛擬的,它們肯定是調用protected部分do_read/do_write虛擬成員函數來完成實際的工作。啊,我簡直為自己的進步而飄飄然了!哈,Wendy,這回你可難不住我,還有什么招數?盡管放馬過來... 突然,笑容在我臉上凝固,因為我看到了其private部分:
private:
??? virtual std::string classID() const = 0;
這是什么?一個private純虛函數,能工作么?我站了起來,
“Wendy,你的Mountie類好像不能工作耶,它有一個private virtual function。”
“你試過了?”她連頭都不抬。
“嗯,那倒是沒有啦,可是想想也不行啊?我的派生類怎么能override你的private函數呢?” 我嘟囔著。
“嗬,你倒是很確定啊!”Wendy的聲音很輕柔,“你怎么老是這也不行,那也不行的,這幾個月跟著我你就沒學到什么東西嗎?小菜鳥。”
真是可惡啊...
“小菜鳥,你全都忘了,訪問控制級別跟一個函數是不是虛擬的根本沒關系。判斷一個函數是動態綁定還是靜態綁定是函數調用解析的最后一個步驟。好好讀讀標準的3.4和5.2.2節吧。”
我完全處于下風,只好采取干擾戰術。“好吧,就算你說的不錯,我也還是不明白,何必把它設為private?”
“我且問你,倘若你不想讓一個類中的成員函數被其他的類調用,應當如何處理?”
“當然是把它設置為private的,” 我回答道。
“那么你去看看我的Mountie類實現,特別是write()函數的實現。”
我正巴不得逃開Wendy那刺人的目光,便轉過頭去在我的屏幕上搜索,很快,我找到了:
void Mountie::write(std::ostream &Dudley) const
{
??? Dudley << classID() << std::endl;
??? do_write(Dudley);
}
嗨,最近卡通片真是看得太多了,居然犯這樣的低級失誤。還是老是承認吧:“好了,我明白了。classID()是一個實現細節,用來在保存對象時指示具象類的類型,派生類必須覆蓋它,所以必須是純虛的。但是既然是實現細節,就應該設為private的。”
“這還差不多,小菜鳥。”大蝦點了點頭,“現在給我解釋一下為什么do_read()和do_write()是protected的?”
這個問題并不難,我組織了一下就回答:“因為派生類對象需要調用這兩個函數的實現來讀寫其中的基類對象。”
“很好很好,”大蝦差不多滿意了,“不過,你再解釋解釋為什么我不把它們設為public的?”
現在我感覺好多了:“因為調用它們的時候必須以一種特定的方式進行。比如do_write()函數,必須先把類型信息寫入,再把對象信息寫入,這樣讀取的時候,負責生成對象的模塊首先能夠知道要讀出來的對象是什么類型的,然后才能正確地從流中讀取對象信息。”
“聰明啊,我的小菜鳥!”Wendy停頓了一下,“就跟學習外國口語一樣,學習C++也不光是掌握語法而已,還必須要掌握大量的慣用法。”
“是啊是啊,我正打算讀Coplien的書...”
[譯者注:就是James Coplien 1992年的經典著作Advanced C++ Programming Style and Idioms]
大蝦揮了揮她的手,“冷靜,小菜鳥,我不是指先知Coplien的那本書,我是指某種結構背后隱含的慣用法。比如一個類有virtual destructor,相當于告訴你說:‘嗨,我是一個多態基類,來繼承我吧!’ 而如果一個類的destructor不是虛擬的,則相當于是在說:‘我不能作為多態基類,看在老天的份上,別繼承我。’”
“同樣的,virtual函數的訪問控制級別也具有隱含的意義。一個protected virtual function告訴你:‘你寫的派生類應該,哦,可是說是必須調用我的實現。’而一個private virtual function是在說:‘派生類可以覆蓋,也可以不覆蓋我,隨你的便。但是你不可以調用我的實現。’”
我點點頭,告訴她我懂了,然后追問道:“那么public virtual function呢?”
“盡可能不要使用public virtual function。”她拿起一支筆寫下了以下代碼:
class HardToExtend
{
public:
? virtual void f();
};
?void HardToExtend::f()
{
?// Perform a specific action
}
“假設你發布了這個類。在寫第二版時,需求有所變化,你必須改用Template Method。可是這根本不可能,你知道為什么?”
“呃,這個...,不知道。”
“由兩種可能的辦法。其一,將f()的實現代碼轉移到一個新的函數中,然后將f()本身設為non-virtual的:
class HardToExtend
{
// possibly protected
??? virtual void do_f();
public:
??? void f();
};
void HardToExtend::f()
{
??? // pre-processing
??? do_f();
??? // post-processing
}
void HardToExtend::do_f()
{
??? // Perform a specific action
}
然而你原來寫的派生類都是企圖override函數f()而不是do_f()的,你必須改變所有的派生類實現,只要你錯過了一個類,你的類層次就會染上先知Meyers所說的‘精神分裂的行徑’。” [譯者注:參見Scott Meyers,Effective C++, Item 37,絕對不要重新定義繼承而來的非虛擬函數]
“另一種辦法是將f()移到private區域,引入一個新的non-virtual函數:”
class HardToExtend
{
// possibly protected
??? virtual void f();
public:
??? void call_f();
};
“這會導致無數令人頭痛的問題。首先,所有的客戶都企圖調用f()而不是call_f(),現在它們的代碼都不能編譯了。更有甚者,大部分派生類都回把f()放在public區域中,這樣直接使用派生類的用戶可以訪問到你本來想保護的細節。”
“對待虛函數要象對待數據成員一樣,把它們設為private的,直到設計上要求使用更寬松的訪問控制再來調整。要知道由private入public易,由public入private難啊!”
[譯者注:這篇文章所表達的思想具有一定的顛覆性,因為我們太容易在基類中設置public virtual function了,Java中甚至專門為這種做法建立了interface機制,現在竟然說這不好!一時間真是接受不了。但是仔細體會作者的意思,他并不是一般地反對public virtual function,只是在template method大背景下給出上述原則。雖然這個原則在一般的設計中也是值得考慮的,但是主要的應用領域還是在template method模式中。當然,template method是一種非常有用和常用的模式,因此也決定了本文提出的原則具有廣泛的意義。]
posted @
2006-05-19 07:23 Jerry Cat 閱讀(669) |
評論 (1) |
編輯 收藏
/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/
非“偽”隨機數的生成
作者: Jerry Cat
時間: 2006/05/16
鏈接:?
http://www.shnenglu.com/jerysun0818/archive/2006/05/16/7232.html
問題的來由 - "隨機取m個數(在1到n的范圍之內),(m <= n),要求m個數沒有重復。有沒有
什么好的算法,時間復雜度和空間復雜度都很好"
----------------------------------------------------------------
方案一:
取隨機數可以用C++標準的rand,至于M個不重復,你可以用std::set來解決,把取道的隨機數
插入到set里面,set的size() == m就可以了, 具體可以這樣:
#include <set>
#include <stdlib.h>
int main()
{
?? std::set<int> s;
?? while(1)
?? {
????? int r = rand() % n;
????? s.insert(r);
????? if(s.size() == m)
????? {
???????? break;
????? }
?? }
}
?由于set底層實現是紅黑樹,插入復雜度是對數級的^_^
----------------------------------------------------------------
方案二:
#include <iostream>
#include <cstdlib>????? //用于rand()和srand()函數
#include <ctime>??????? //設置不同的隨機數
using namespace std;
int main (){
??? srand( time( 0 ) );??? //調用不重復的隨機數函數
??? unsigned i;
??? for ( int n = 0; n++ < 10; )
??? {
??????? i = rand() ;??????? //對i 賦系統的隨機數
??????? cout << " The NO." << n << "is : " << i << endl;
??? }
??? return 0;
}
1. C++標準函數庫提供一隨機數生成器rand,返回0-RAND_MAX之間均勻分布的偽隨機整數。 RAND_MAX
?? 必須至少為32767。rand()函數不接受參數,默認以1為種子(即起始值)。
?? 隨機數生成器總是以相同的種子開始,所以形成的偽隨機數列也相同。失去了隨機意義。
2. C++中另一函數srand(),可以指定不同的數(無符號整數變元)為種子。但是如果種子相同,偽
?? 隨機數列也相同。--一個辦法是讓用戶輸入種子,但是仍然不理想。
3. 比較理想的是用變化的數,比如時間來作為隨機數生成器的種子。
?? 在 頭文件ctime中時間庫包含time函數,它可以返回一個表示時間、日期、月和年的數值使用如
?? 下調用可將該值設為rand的種子
?? srand(static_cast<unsigned>(time(static_cast<time_t*>(NULL))));
4. 但, srand()并不是說使隨機數都不一樣,它只是使取隨機數的種子隨著時間而改變:)
?? So, 還是方案一好!
posted @
2006-05-16 00:17 Jerry Cat 閱讀(2539) |
評論 (7) |
編輯 收藏
/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/
作者: Jerry Cat
時間: 2006/05/16
鏈接:?http://www.shnenglu.com/jerysun0818/archive/2006/05/16/7231.html
類成員函數指針的一點體悟
類的成員函數分為兩種,一種是靜態函數,另外一種是非靜態函數。例如:
class X
{
public:
?static void display();
?bool getValue();
}
display()為靜態函數,getValue即為非靜態函數。兩種函數在使用的時候是不一樣的。靜態函數
可以直接由類名來調用,而非靜態函數則必須通過某一個對象來調用,例如:
X::display();
X x;
x.getValue();
為什么會出現這樣的情況了?這是由于編譯器在處理這兩種函數的方式不同造成的。靜態函數在
運行期只有一份拷貝,所有該類生成的對象共享該函數以及該函數的內部變量。而對于非靜態函數,
不同的對象擁有自己的內部變量。
在使用類成員函數指針的時候同樣也會不同。
靜態成員函數可以當作全局函數來調用。
可以定義以下函數指針:
typedef void (*pf)();
pf p=X::display;
(*p)();? //或p();
也可以當作參數傳遞到全局函數里:
void Display(pf p)
{
?(*p)();
//或p();
}
Display(X::display);
如果是非靜態成員函數,其函數指針則是另一種寫法:
typedef void (X::*pf2)();
這一類指針只能用于本類之內。
posted @
2006-05-16 00:12 Jerry Cat 閱讀(1156) |
評論 (2) |
編輯 收藏
/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/
C++對象模型(7) -? Member Initialization List
作者: Jerry Cat
時間: 2006/05/12
鏈接:?
http://www.shnenglu.com/jerysun0818/archive/2006/05/12/6978.html
2.4 Member Initialization List
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
When you write a constructor, you have the option of initializing class members either through the
member initialization list or within the body of the constructor. Except in four cases, which one
you choose is not significant.
In this section, I first clarify when use of the initialization list is "significant" and then
explain what actually gets done with that list internally. I then look at a number of possible,
subtle pitfalls.
You must use the member initialization list in the following cases in order for your program to compile:
(1). When initializing a reference member
(2). When initializing a const member
(3). When invoking a base or member class constructor with a set of arguments
???? 低效的第四種情況
In the fourth case, the program compiles and executes correctly. But it does so inefficiently.
For example, given
class Word {
?? String _name;
?? int _cnt;
public:
?? // not wrong, just naive ...
?? Word() {
????? _name = 0;
????? _cnt = 0;
?? }
};
this implementation of the Word constructor initializes _name once, then overrides the
initialization with an assignment, resulting in the creation and the destruction of a temporary
String object. Was this intentional? Unlikely. Does the compiler generate a warning? I'm not aware
of any that does. Here is the likely internal augmentation of this constructor:
// Pseudo C++ Code
Word::Word( /* this pointer goes here */ )
{
?? _name.String::String();???????? // invoke default String constructor
?? String temp = String( 0 );????? // generate temporary
?? _name.String::operator=( temp );// memberwise copy _name
?? temp.String::~String();???????? // destroy temporary
?? _cnt = 0;
}
Had the code been reviewed by the project and corrected, a significantly more efficient
implementation would have been coded:
// preferred implementation
Word::Word : _name( 0 )
{
?? _cnt = 0;
}
This expands to something like this:
// Pseudo C++ Code
Word::Word( /* this pointer goes here */ )
{?? // invoke String( int ) constructor
?? _name.String::String( 0 );
?? _cnt = 0;
}
This pitfall, by the way, is most likely to occur in template code of this form:
template < class type >
foo< type >::foo( type t )
{
?? // may or may not be a good idea depending on the actual type of type
?? _t = t;
}
This has led some programmers to insist rather aggressively that all member initialization be done
within the member initialization list, even the initialization of a well-behaved member such as _cnt:
// some insist on this coding style, 順序有問題!
Word::Word() : _cnt( 0 ), _name( 0 )
{}
Actually, there is a subtlety to note here: The order in which the list entries are set down is
determined by the declaration order of the members within the class declaration, not the order
within the initialization list. In this case, _name is declared before _cnt in Word and so is placed first.
This apparent anomaly between initialization order and order within the initialization list can
lead to the following nasty pitfall:
class X {
?? int i;
?? int j;
public:
?? // oops!? do you see the problem?
?? X( int val ) : j( val ), i( j )
?? {}
?? ...
};
// preferred idiom, 解決咯
X::X( int val ) : j( val )
{
?? i = j;
}
Here is an interesting question: Are the entries in the initialization list entered such that the
declaration order of the class is preserved? That is, given
// An interesting question is asked:
X::X( int val ) : j( val )
{
?? i = j;
}
is the initialization of j inserted before or after the explicit user assignment of j to i? If
the declaration order is preserved, this code fails badly. The code is correct, however, 這才是
真正的原因 - because the initialization list entries are placed before explicit user code.
所以成員初始化不是一股腦兒都放到初始化列表里才是最優方案!
Another common question is whether you can invoke a member function to initialize a member, such as
// is the invocation of X::xfoo() ok?? 問得好!
X::X( int val ) : i( xfoo( val )), j( val )
{}
where xfoo() is a member function of X. The answer is yes, but…. To answer the "but" first, I
reiterate my advice to initialize one member with another inside the constructor body, not in the
member initialization list. You don't know the dependencies xfoo() has regarding the state of the
X object to which it is bound. 還是那句話: 別將所有的成員初始化工作全放在構造函數的初始化列表里 -
By placing xfoo() within the constructor body, you can ensure there is no ambiguity about which
members are initialized at the point of its invocation.
The use of the member function is valid (apart from the issue of whether the members it accesses
have been initialized). This is because the this pointer associated with the object being
constructed is well formed and the expansion simply takes a form like the following:
// Pseudo C++ Code: constructor augmentation
X::X( /* this pointer, */ int val )//一般都將this指針缺省, 但它的確是存在的, 至少對編譯器而言
{
?? i = this->xfoo( val );
?? j = val;
}
where xfoo() is a member function of X. The answer is yes, but…. To answer the "but" first, I
reiterate my advice to initialize one member with another inside the constructor body, not in the
member initialization list. You don't know the dependencies xfoo() has regarding the state of the
X object to which it is bound. By placing xfoo() within the constructor body, you can ensure
there is no ambiguity about which members are initialized at the point of its invocation.
The use of the member function is valid (apart from the issue of whether the members it accesses
have been initialized). This is because the this pointer associated with the object being
constructed is well formed and the expansion simply takes a form like the following:
// Pseudo C++ Code: constructor augmentation
X::X( /* this pointer, */ int val )
{
?? i = this->xfoo( val );
?? j = val;
}
In summary, the compiler iterates over and possibly reorders the initialization list to reflect
the declaration order of the members. It inserts the code within the body of the constructor
prior to any explicit user code. 成員初始化列表的內容"插"在構造函數的最前端.
posted @
2006-05-12 00:49 Jerry Cat 閱讀(789) |
評論 (0) |
編輯 收藏