動機:
每次電腦開機時,會把自己的電腦名稱,傳到一網址。
為了知道哪台電腦獲哪個IP。
最基本的作法:
最簡單在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
加一筆 字串值
curl.exe -s http://1.2.3.4/host/NAME
或
wget.exe -q http://1.2.3.4/host/NAME
限制:
由於電腦都是 clone 同一 Image,
並利用 winroll,
會根據事先定義的MAC address,自動改自己的名稱。
常常會需要recovery,所以不以各台去手動修改其 registry。
而需自己擷取自身的電腦名稱而送出。
(DHCP 不是我管的,無法從 DHCP 上查何MAC address為何IP)
(NetBIOS 也存取不到)
而從 web server 就可看到何 IP 送出什麼電腦名稱,
而不需把自身的IP送出。
可能取得電腦名稱的方法:
set |find "COMPUTERNAME" | gawk -F= "{print $2}"
這樣子可以獲得本機的電腦名稱,
但在 windows 的 Batch,
好像沒辦法像 shell script 那樣,
以外部指令的結果,當成變數的值:
var = pwd
可以的解決方法:
試著查看 Windows Script 5.6 Documentation,
可能的作法如下:
編輯 myname.vbs
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ("%windir%\curl.exe -s http://1.2.3.4/host/" & WshShell.ExpandEnvironmentStrings(WshNetwork.ComputerName))
然後在 registry 的字串值設:
cscript myname.vbs
這樣就可以達到想要的目的。
Windows 的 Script 相較於 Shell Script,
不大容易入手,
是否還有其他可能的作法可建議或語法的修改?
XP SP3 有hostname的指令
似乎可以拿來應用
<pre class="c" name="code">
copy con sendname.bat
curl.exe -s http://1.2.3.4/host/^Z(Enter)
hostname >> sendname.bat(Enter)
call sendname(Enter)
原來 XP 裡有 hostname。
「建立一個有第2行的內容,
再把第4行的結果附在最後面。」
不曉得有什麼可以一個script 指令做出來?
這是個可以的做法,
但我試著用
<pre class="c" name="code">echo curl.exe -s http://1.2.3.4/host/ > sendme.bat
hostname >> sendname.bat
hostname 的結果卻都在下一行,
不曉得有什麼辦法拿掉 echo 後面的 \r或\n,
這樣 hostname >> 就可併在同一行的最後面?
剛剛又上網找了一下
發現還有%COMPUTERNAME%這個變數可以用
<pre class="c" name="code">
echo curl.exe -s http://1.2.3.4/host/%computername% > sendme.bat
在下真是不求甚解
慚愧慚愧...
原來如此,舉一反三:
執行 set 結果中的 KEY/變數,
都可以包在 % % 裡叫出。
不曉得除了 set 之外,
還有什麼可包在 % % 裡面而叫出?
試了一下:
<pre class="c" name="code">curl.exe -s http://1.2.3.4/host/%computername%
這樣就可以執行了,不需再echo成一個batch檔。
下 set /? 指令的最後幾列
<pre class="c" name="code">
%CD% - 展開為含目前目錄的字串。
%DATE% - 展開為與 DATE 命令格式相同的目前日期字串。
%TIME% - 展開為與 TIME 命令格式相同的目前時間字串。
%RANDOM% - 展開為一個在 0 和 32767 之間的整數亂數值。
%ERRORLEVEL% - 展開為目前的 ERRORLEVEL 值
%CMDEXTVERSION% - 展開為目前的命令處理擴充功能的版本號碼。
%CMDCMDLINE% - 展開為執行命令處理器前的原始命令列。
BAT 太簡單 Windows Script 用太複雜
我都用 Autoit 做PC的自動化處理
inetget("http://1.2.3.4/hosts/" & @computername)
AutoIt實在是太棒了,
站上曾偶爾被介紹,卻沒留意到。
自己試了,用以下的語法都可行:
<pre class="c" name="code">InetGet("http://1.2.3.4/host/" & @computername, "")
Run(@WindowsDir & "\curl.exe -s http://1.2.3.4/host/" & @computername,"",@SW_HIDE)
第一行用AutoIt的內建web client送出,
web server 端顯示用的 Agent 是 "AutoIt";
後面一定要加個檔名或空的參數,才會跑。
還可以編成 exe 檔。這工具太妙了!
一時大意漏了一個不能省略的參數,感謝指正。
剛開使用AutoIT,不像我中毒太深的話也可以考慮AutoHotkey
這段歷史是因為AutoIT從2.X升到3.X的大改版,不但語法改變了,也取消了GPL授權。
所以有了AutoHotkey這個新專案,沿用了AutoIT 2.X的語法,也沿用GPL授權,同時發展出AutoIT 3.X 相同的功能
話說記錄電腦名稱越來越多遊戲公司會做這種事情...
現在遊戲公司不但記錄IP、MAC碼、ISP....還記錄使用者名稱、電腦名稱...