iT邦幫忙

11

用WSH傳自身的電腦名稱

動機
每次電腦開機時,會把自己的電腦名稱,傳到一網址。
為了知道哪台電腦獲哪個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,
不大容易入手,
是否還有其他可能的作法可建議或語法的修改?


0
海綿寶寶
iT邦超人 1 級 ‧ 2010-06-02 11:17:02

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% - 展開為執行命令處理器前的原始命令列。
0
James
iT邦大師 7 級 ‧ 2010-06-02 12:44:06

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 檔。這工具太妙了!

James iT邦大師 7 級‧ 2010-06-03 11:23:08 檢舉

一時大意漏了一個不能省略的參數,感謝指正。
剛開使用AutoIT,不像我中毒太深的話也可以考慮AutoHotkey
這段歷史是因為AutoIT從2.X升到3.X的大改版,不但語法改變了,也取消了GPL授權。
所以有了AutoHotkey這個新專案,沿用了AutoIT 2.X的語法,也沿用GPL授權,同時發展出AutoIT 3.X 相同的功能

0
lirick42
iT邦新手 1 級 ‧ 2010-06-02 13:56:05

話說記錄電腦名稱越來越多遊戲公司會做這種事情...
現在遊戲公司不但記錄IP、MAC碼、ISP....還記錄使用者名稱、電腦名稱...

0
蟹老闆
iT邦大師 1 級 ‧ 2010-06-05 22:36:16

感謝分享

我要留言

立即登入留言