我們單位裡
會議室裡的Windows
PC是最忙的PC
這些PC連接著投影設備
經常要運行PowerPoint之類的系統
為了避免網絡對幻燈放映效果的影響
用戶的典型做法是
首先登錄會議室的PC
然後從自己的機器上把PowerPoint演示文稿復制到本地
由於會議室的PC很難做到定期維護
往往要到無法正常使用時才會引起注意
例如
有人想把一個演示文稿復制到會議室PC
卻發現磁盤已經滿了
有人從會議室PC復制了一個文件
卻發現這個文件帶有病毒
有時會意外地發現另一個擁有管理權限的用戶把C盤的全部訪問權授予了Guests組
為了解決諸如此類的問題
我們讓系統自動執行清理文件的任務並定期報告自己的狀態
清理操作每周執行一次
防止磁盤空間耗盡
根據會議室PC的應用情況
清理任務包括
刪除過期的用戶配置文件
大多數用戶經常忘記清理自己復制到會議室PC的演示文稿
這些PC上過時的用戶配置文件中充塞著大量被廢棄的文檔
只要刪除用戶配置文件
被廢棄的演示文稿也就一起被刪除
從實際情況判斷
凡是
天以上沒有人使用的配置文件
執行清理任務的腳本都可以安全地刪除它們
刪除email文件
一些用戶通過會議室PC收發郵件
並把郵件留在了本地磁盤上(Outlook的
pst文件)
按照單位規定
會議室PC不允許收發email
所以必須刪除所有
pst文件
刪除臨時文件
某些應用軟件會留下龐大的
tmp文件
刪除這類文件不影響正常使用
每月報告一次PC的狀態
雖然每周執行清理任務
意外問題仍有可能出現
為了保證PC盡可能正常地運行
必須讓PC自動生成狀態報告並通過email發送給指定的收件人
報告內容包括
可用的磁盤空間
由於用戶經常把龐大的多媒體文件復制到會議室PC
雖然每周執行自動清理過期用戶配置文件和臨時文件的操作
但磁盤空間仍是一個必須密切關注的問題
病毒定義文件的更新日期
由於某些原因
如網絡故障
殺毒軟件McAfee VirusScan未能及時更新病毒定義信息
部分機器的病毒定義信息過期
使這些機器面臨被新型病毒感染的風險
由於每一台PC的配置
更新情況不一致
所以不能采用簡單的重新安裝軟件的辦法
只能讓腳本自動報告最後更新日期
Messenger服務的狀態
在會議室PC上
為了防止Net Send網絡消息在放映幻燈時突然跳出來
所以禁用了Windows的Messenger服務
某些用戶可能在無意之中打開了Messenger服務
腳本必須報告該服務的狀態
我們用AutoReport
bat批命令腳本完成上述任務
雖然這個腳本是為了維護會議室PC編寫的
但只要稍加改變
不難應用到其他場合
一
刪除過期的用戶配置文件
為了刪除不再使用的用戶配置文件
AutoReport
bat用到了Delprof工具
這個工具在Microsoft Windows
Server Resource Kit和Microsoft Windows NT Server
Resource Kit都有
但不同操作系統的工具不能混用
如果用了版本錯誤的Delprof
會出現錯誤信息
Entry point not found
刪除過期用戶配置文件的命令為
delprof
exe /q /d:
/q選項表示Delprof以
安靜
模式運行
即在刪除用戶配置文件之前不必進行確認
/d:
選項指定了允許用戶配置持續保持不激活狀態的最長天數
也就是說
這裡要求Delprof刪除所有不激活時間超過
天的用戶配置文件
二
刪除
pst和
tmp文件
為了刪除所有
pst和
tmp文件
腳本運用了一個For命令
For命令中的df是一個查找驅動器的免費工具
可以從~chrisd/public/df
zip下載
df的輸出內容很多
不僅僅是一個驅動器的清單
所以要把輸出重定向到Find命令
Find命令查找輸出內容中包含冒號(:)的字符串——即表示驅動器的字符串
對於每一個找到的驅動器
Del命令刪除所有以
pst和
tmp擴展名結尾的文件
/s選項要求Del命令搜索當前目錄及其所有子目錄
/q選項要求Del命令以
安靜
模式運行
三
創建狀態報告
AutoReport
bat利用多個NTFS文件流來跟蹤什麼時候發送狀態報告email
文件流以%ComputerName%
maildate
txt的形式命名
其中%ComputerName%是一個系統定義的環境變量
它的值是用戶當前登錄的機器的名稱
這樣
每一台PC都有一個對應的隱藏流
隱藏流包含了最後為該台機器發送狀態報告的日期
腳本運行時讀取這個信息
如果本月已經發送過狀態報告
則不再發送
如果本月尚未發送狀態報告
則獲取必要的數據
寫入並發送報告
再把當前的日期寫入與該台機器對應的隱藏流
獲取數據
在獲取狀態數據的過程中
AutoReport
bat腳本用到了多種工具和技術
主要包括
空閒的磁盤空間
腳本通過df工具獲得這方面的信息
df的輸出中包含了每一個驅動器的總容量和空閒空間百分比
病毒定義文件的日期
腳本獲取C:\program files\ common files\network associates\virusscan engine\
xx\clean
dat文件的最後修改日
由於各台會議室PC上該文件的位置不同
腳本通過幾個If Exist命令確定該文件的正確位置
Messenger服務的狀態
腳本用到了Windows
K Resource Kit提供的Srvinfo工具
執行Srvinfo時指定
s選項可獲得在各台PC上運行的服務清單
如果Messenger服務正在運行
腳本在狀態報告中寫入警告信息
寫入並發送狀態報告
腳本把收集到的數據寫入blat
txt文件作為郵件的正文
然後填寫郵件的收件人
發件人
主題
最後發送消息
郵件發送任務由Blat工具完成
Blat是一個能夠在Windows命令行發送郵件的工具
可以從免費下載
它的README文件提供了完善的安裝
語法說明和應用實例
在blat命令中
%SystemDrive%\blat
txt指定了包含郵件內容的文件
其中%SystemDrive%是系統定義的環境變量(表示系統盤位置)
s選項指定了郵件的主題
server選項指定了發送郵件時使用的SMTP服務器
f選項指定了發送者的郵件地址
t選項指定了收件人的郵件地址
為了使腳本代碼更容易維護和閱讀
這裡沒有直接在命令行指定SMTP郵件服務器
發件人地址
收件人地址
而是使用了用戶定義的環境變量
分別是%MailServer%
%Sender%和%Recipients%
記錄當前日期
把狀態報告發送給指定的收件人之後
接下來要做的是把當前日期寫入隱藏流
下次腳本運行時
就可以通過檢查這個日期確定是否發送狀態報告
四
如何使用
根據上述思路
AutoReport
bat的完整代碼如下
@ECHO OFF
CLS
SETLOCAL
:: 調試模式
以
AutoReport
bat debug
形式運行命令進入調試模式
:: 調試模式輸出詳細的屏幕信息
(SET comment=REM )
IF /I
%
==
debug
@ECHO ON & (SET comment=) & GOTO :Launch
SET arg=%
IF DEFINED arg (ECHO 執行 %
debug 可看到詳細的命令輸出
)
IF DEFINED arg (ECHO 執行 %
不帶參數隱藏命令輸出
) & (Pause) & (GOTO :EOF)
:Launch
GOTO :BEGIN
:: **************************************************
:: 要用到的工具
::
:: 名稱
delprof
exe和srvinfo
exe
:: 來自
Windows
或NT Resource Kit
::
:: 名稱
df
exe
:: 來自
~chrisd/public/df
zip
::
:: 名稱
Blat
:: 來自
Http:///~tcharron/l
:: **************************************************
:BEGIN
:: 放置工具軟件的位置
SET SharedDir=\\ServerDir\tools
:: 用來發送郵件的SMTP服務器
SET MailServer=
:: 郵件的發件人
SET Sender=
:: 郵件的收件人清單
用逗號分隔多個地址
SET Recipients=F
Se
:: 刪除以前可能留存的Blat
txt文件(如因為腳本被中止運行)
IF EXIST %systemdrive%\Blat
txt del %systemdrive%\Blat
txt
IF EXIST %systemdrive%\Blat
txt del %systemdrive%\Blat
txt
:: 刪除過期的用戶配置文件
:: 該命令已被注釋掉
請在啟用它之前仔細閱讀Delprof的說明
:: 如必要
調整允許保留的天數(/d:選項)
:: echo yes|%SharedDir%\DELPROF
EXE /Q /D:
:: 清除PST和TMP文件
:: 該命令已被注釋掉
:: 在啟用它之前請確認不會出現負面影響
rem for /F
tokens=
%%i in (
%SharedDir%\Df
exe ^| find
:
) do (del /Q /S %%i*
pst) & (del /Q /S %%i*
tmp)
:: 檢查本月是否已經發送過報告狀態的email
FOR /F
tokens=
delims=/
%%i in (
Date /T
) DO (SET curmonth=%%i)
FOR /F %%i in (%
:%COMPUTERNAME%
maildate
txt) DO (SET olddate=%%i)
IF
%curmonth%
==
%olddate%
ECHO 本月已經發送過郵件
& GOTO :skipmail
:: 檢查病毒定義文件
ECHO ******* %COMPUTERNAME% 的病毒定義文件*******>>%systemdrive%\Blat
txt
ECHO
>>%systemdrive%\Blat
txt
SET Fi
From:http://tw.wingwit.com/Article/os/xtgl/201311/8839.html