Nov 19

因為 DHCP server 是用 Win2003 Server,然後也沒有將 MAC 卡號和 IP 綁在一起,所以想要用程式來得知上網電腦的名稱、IP 和網路卡號(另一個原因就是我沒有權限進去 DHCP server @@")並定期更新來確認使用者,這樣也比較好管理。

  1. PHP:
  2. 因為是在 Server 上執行,所以只能取得 IP,MAC 卡號需要中間沒有 Layer-2 Switch 才不會變更卡號(藉由 Server 與 Client 之間的 arp),至於電腦名稱就要不到了。

  3. Java Script:
  4. 不過需要用到 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)。

加入這篇文章到書籤網站或寄給朋友分享
Entry End
文章引用網址:
http://article.denniswave.com/6426/trackback

yarpp_ralated_post 相關文章 yarpp_ralated_post

One Response to “[PHP] IP、MAC、電腦名稱取得”

  1. 六藝草堂

    [XP] 用命令列新增排定工作...

    因為寫了一篇自動取得 IP、MAC、電腦名稱的程式,後來就是要讓電腦每週執行,所以需要加到排定的工作。想當然~一定要用命令列來加入比較好散佈到各台電腦。

    還有就是正常執行會出現命令提示字元的視窗,這邊有人試出來可以讓他不出現(就是執行身份改成:"NT AUTHORITY\SYSTEM")
    所以要讓每個星期一、四每天中午 12:10 執行 C:\IP.exe 的話,就這樣寫就可以了:

    schtasks /Create /RU "NT AUTHORITY\SYSTEM" /SC WEE...

新增迴響

Valid XHTML 1.1 Valid CSS3! CC:by-nc-sa_2.5 anti_IE

關閉