萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> asp.net編程 >> .net通過獲取客戶端IP地址反查出用戶的計算機名

.net通過獲取客戶端IP地址反查出用戶的計算機名

   要求:內部網站某一個菜單只允許規定的域用戶訪問,不能用登錄窗口,類似用戶名密碼這樣的東西。

  解決方法:用戶點擊菜單,得到IP,用NBTSTAT -A IP得到客戶端的計算機名,在後台程序中用正則過濾出計算機名進行判斷。

  下面是部分代碼和解決方法,變通還是很重要的,細節不是重點,重點是想法,當然你可以把代碼寫的更漂亮高效,^^。

  你可以新建個頁面,在後台寫上下面的代碼。

  ////////////////////////////////////////////////////////////

  if (!IsPostBack)

  {

  string strClientHostname = GetHostname(GetIP());

  if (strClientHostname == "china-2021-k90" || strClientHostname == "china-hjbai" )

  {

  bind(); //輸出結果

  }

  else

  {

  Page.ClientScript.RegisterStartupScript(this.GetType(), "Warning", "");

  }

  }

  ////////////////////////////////////////////////////////////

  //得到客戶端IP

  public string GetIP()

  {

  string uip = "";

  if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)

  {

  uip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

  }

  else

  {

  uip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();

  }

  return uip;

  }

  ////////////////////////////////////////////////////////////

  public string GetHostname(string IP)

  {

  string dirResults = "";

  ProcessStartInfo psi = new ProcessStartInfo();

  Process proc = new Process();

  //這裡聰明的你會想到很多命令的有趣用法吧

  //psi.FileName = "ping ";

  //psi.RedirectStandardInput = false;

  //psi.RedirectStandardOutput = true;

  //psi.Arguments = "-a -n 1 " + IP;

  psi.FileName = "nbtstat ";

  psi.RedirectStandardInput = false;

  psi.RedirectStandardOutput = true;

  psi.Arguments = "-A " + IP;

  //這裡對結果進行正則過濾,你可以在CMD窗口運行DOS命令看下結果,這樣會更明了

  psi.UseShellExecute = false;

  proc = Process.Start(psi);

  dirResults = proc.StandardOutput.ReadToEnd();

  proc.WaitForExit();

  dirResults = dirResults.Replace("r", "").Replace("n", "").Replace("t", "");

  Regex reg = new Regex("china-(?:[a-z][a-z0-9_]*)*", RegexOptions.IgnoreCase | RegexOptions.Compiled);

  dirResults = dirResults.ToLower();

  Match mc = reg.Match(dirResults);

  //Response.Write(dirResults.ToLower());

  if (mc.Success)

  {

  return mc.ToString();

  }

  else

  {

  //這個是正則的另一種拼接方法,因為有些計算機名比較特殊

  string re1 = "(china)"; // Word 1

  string re2 = "([-+]d+)"; // Integer Number 1

  string re3 = "(-)"; // Any Single Character 1

  string re4 = "((?:[a-z][a-z0-9_]*))"; // Variable Name 1

  Regex r = new Regex(re1 + re2 + re3 + re4, RegexOptions.IgnoreCase | RegexOptions.Singleline);

  Match mc2 = r.Match(dirResults.ToLower());

  if (mc2.Success)

  {

  return mc2.ToString();

  }

  else

  {

  reg = new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);

  mc = reg.Match(dirResults);

  if (mc.Success)

  {

  return "Host not found!";

  }

  else

  {

  return "";

  }

  }

  }

  }

  //////////////////////////////////////////////////////////////

copyright © 萬盛學電腦網 all rights reserved