[PHP] IP、MAC、電腦名稱取得

因為 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)。

Please follow and like us:

2 comments on “[PHP] IP、MAC、電腦名稱取得

  1. 您好:
    找尋相關資料時找到您這篇文章,發現真的是很棒的文章…
    但是在您公佈的原始碼中,不知如何應用,所以想請教您,可否請您撥冗解惑:
    在原始碼中有看到…
    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中

1 Pings/Trackbacks 於 "[PHP] IP、MAC、電腦名稱取得"

  1. [XP] 用命令列新增排定工作...
    因為寫了一篇自動取得 IP、MAC、電腦名稱的程式,後來就是要讓電腦每週執行,所以需要加到排定的工作。想當然~一定要用命令列來加入比較好散佈到各台電腦。
    還有就是正常執行會出現命令提示字元的視窗,這邊有人試出來可以讓他不出現(就是執行身份改成:"NT AUTHORITY\SYSTEM")
    所以要讓每個星期一、四每天中午 12:10 執行 C:\IP.exe 的話,就這樣寫就可以了:
    schtasks /Create /RU "NT AUTHORITY\SYSTEM" /SC WEE...

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *