因為 DHCP server 是用 Win2003 Server,然後也沒有將 MAC 卡號和 IP 綁在一起,所以想要用程式來得知上網電腦的名稱、IP 和網路卡號(另一個原因就是我沒有權限進去 DHCP server @@")並定期更新來確認使用者,這樣也比較好管理。
- PHP:
- Java Script:
因為是在 Server 上執行,所以只能取得 IP,MAC 卡號需要中間沒有 Layer-2 Switch 才不會變更卡號(藉由 Server 與 Client 之間的 arp),至於電腦名稱就要不到了。
不過需要用到 ActiveX,這樣每次更新的時候,還要終端使用者來允許 ActiveX 執行,所以不能在 FireFox 執行,也一樣找不到抓取電腦名稱的方法。
所以後來就只能在 Client 端執行,執行後將資料用 socket 傳上 Server。因為我只比較熟悉 PHP 語法,所以就寫了個 PHP 來抓取所需的資料;不過,如果使用者權限不足,沒辦法用 nbtstat 來抓取電腦的工作群組。
寫好的程式,可以用 Bambalam PHP EXE Compiler 來把它變成 EXE 檔。
Client 執行程式:
<? $output1 = shell_exec('ipconfig /all'); $time = date('Y-m-d H:i:s'); // 抓 電腦名稱、IP、MAC 卡號 if (ereg (".*Host.*:.([a-zA-Z0-9_]*).*Pri.*Phy.*:.(.{17}).*Dhcp.*IP.*:.(192.*[0-9]).*Sub.*254", $output1, $regs)) { $output2 = shell_exec('nbtstat -A '.$regs[3]); // 抓 網路芳鄰的工作群組(便於辨別電腦) if (ereg ($regs[3].".*Registered.*[[:space:]]+([a-zA-Z0-9_]+)[[:space:]]+<00>", $output2, $group)) { $name = $regs[1]." @ ".$group[1]; } else { $name = $regs[1]; } // 將結果傳送到網頁 $fp = fsockopen("192.168.51.34", 80, $errno, $errstr, 30); if (!$fp) { echo "connection failed.<br>"; } else { $post_data = "date=".urlencode($time)."&ip=".urlencode($regs[3])."&mac=".urlencode($regs[2])."&name=".urlencode($name); $ver = " HTTP/1.1"; $talk = "GET /ip/added.php?"; $talk .= ($post_data); $talk .= ($ver)."\r\n"; $talk .= "HOST:192.168.51.34\r\n"; $talk .= "Keep-Alive:300\r\n"; $talk .= "Content-Type:application/x-www-form-urlencoded\r\n"; $talk.= "Content-length: " . strlen($post_data) . "\r\n"; $talk.= "\r\n"; fwrite($fp, $talk); fclose($fp); } } else { echo "Fail!!"; } ?>
收集結果的網頁:
<html xmlns="http://www.w3.org/1999/xhtml"> <head profile="http://gmpg.org/xfn/11"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>IP Table - Add</title> <link href="j_style/style.css" rel="stylesheet" type="text/css" /> </head> <body> <?php include("connect.php"); $date = $_GET['date']; $ip = $_GET['ip']; $mac = $_GET['mac']; $name = $_GET['name'];$query = "INSERT INTO ip (id, date, ip, mac, name) VALUES ('', '$date', '$ip', '$mac', '$name')";$results = mysql_query($query) or die ("Could not execute query : $query." . mysql_error());if ($results) { echo "<h2>Details added.</h2>"; echo "<br />"; echo "<a href='index.php'>Back to List</a><br />"; echo "<span id='second'>5 </span>秒後自動回到首頁"; } mysql_close(); ?><script type="text/javascript"> setTimeout("countdown()", 1000); function countdown() { var s = document.getElementById("second"); s.innerHTML = s.innerHTML - 1; if (s.innerHTML == 0) window.location = "index.php"; else setTimeout("countdown()", 1000); } </script> </body></html>
後來剩下的就是把執行的程式散佈到要收集資料的電腦,後來再找方法讓他可以自動進入排程執行(已經越來越像木馬了...XD)。
您好:
找尋相關資料時找到您這篇文章,發現真的是很棒的文章…
但是在您公佈的原始碼中,不知如何應用,所以想請教您,可否請您撥冗解惑:
在原始碼中有看到…
1./ip/added.php:想問added.php檔案內容
2.include("connect.php");:connect.php檔案內容
3.$query = "INSERT INTO ip (id, date, ip, mac, name):寫入資料庫,那資料庫的資料表欄位是否就是這五個寫入ip這個資料庫呢??
不好意思,程式我不是很懂,所以問的問題很笨,可否請您撥冗解惑,謝謝!!!
1.感覺應該是把收集結果的網頁下面的程式碼存成added.php
2.connect.php 依照寫的內容應該是連結資料庫用的帳密
3.ip不是資料庫,是資料夾把id, date, ip, mac, name這5個資料經由connect.php寫入資料庫資料庫名稱在程式上看不到所以自己定義且引入到added.php中