0

如上所述,在做了很多尝试和错误之后,我仍然坚持这一点,到目前为止我发现的所有参考仍然无法解决这个问题,因为我根本无法获得真正的计算机名称,而是我之前尝试过的大多数示例将返回服务器名称或最接近的服务器名称将返回“10”,无论它捕获了多少用户。我正在为我的系统创建一个日志功能,到目前为止,我可以在下面的代码中获取域名、用户 IP 地址、用户 ID:

请有人指导我如何获得“用户计算机名”......TQ大家

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Mail;
using System.IO;
using System.Globalization;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using Microsoft.SharePoint;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    {
        SPSite spSite = SPContext.Current.Site;
        SPSite spConvSite = new SPSite("www.mywebsite.com");
        SPWeb spWeb = SPContext.Current.Web;
        SPWeb spConvWeb = spConvSite.OpenWeb();
        SPUser spUser = spWeb.CurrentUser;

        string strDateLogCreated = DateTime.Now.ToString("ddMMyyyy-hhmmsstt", CultureInfo.InvariantCulture);
        string LogFolder = "D:\\Logs\\Client";
        string[] LocalComputerName = System.Net.Dns.GetHostEntry(Request.ServerVariables["remote_addr"]).HostName.Split(new Char[] { '.' });
        String ecn = System.Environment.MachineName;
        string domainName = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
        string hostName = Dns.GetHostName();
        IPGlobalProperties  ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        string testHost = ipProperties.HostName;
        string testDomain = ipProperties.DomainName;
        string strLocalIPAddress = HttpContext.Current.Request.UserHostAddress.ToString();

        string hName = "";      
        System.Net.IPHostEntry host = new System.Net.IPHostEntry();
        host = System.Net.Dns.GetHostEntry(HttpContext.Current.Request.ServerVariables["REMOTE_HOST"]);

        //Split out the host name from the FQDN
        if (host.HostName.Contains("."))
        {
        string[] sSplit = host.HostName.Split('.');
        hName = sSplit[0].ToString();
        }
        else
        {
        hName = host.HostName.ToString();
        }
        //return hName;


        StreamWriter swLogFile = File.AppendText(String.Format(@"{0}\Client-{1}.log", LogFolder, strDateLogCreated));

        swLogFile.WriteLine("*** Date & Time : " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture));
        swLogFile.WriteLine("*** Initiated By : " + spUser.Name.ToString());
        swLogFile.WriteLine("*** LAN ID : " + spUser.LoginName.ToString());
        swLogFile.WriteLine("*** Computer Name : " + LocalComputerName[0].ToString());
        swLogFile.WriteLine("*** IP Address : " + strLocalIPAddress.ToString());
        swLogFile.WriteLine("---------------------------------------------------");
        swLogFile.WriteLine(DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture) + " - " + "Successfully captured.");
        swLogFile.WriteLine("=====================================================================================================");
        swLogFile.WriteLine("Test 1 : " + domainName.ToString());
        swLogFile.WriteLine("Test 2 : " + hostName.ToString());
        swLogFile.WriteLine("Test 3 : " + testHost.ToString());
        swLogFile.WriteLine("Test 4 : " + System.Environment.GetEnvironmentVariable("COMPUTERNAME"));
        swLogFile.WriteLine("Test 5 : " + System.Net.Dns.GetHostEntry(Request.ServerVariables["REMOTE_HOST"]).HostName);
        swLogFile.WriteLine("Test 6 : " + hName.ToString());
        swLogFile.Flush();
    }

像这样的输出示例:

Date & Time : 18/02/2013 11:45:26 AM

Initiated By : USER NAME

LAN ID : DOMAIN\ID99999

Computer Name : 10 //I don't get the real user computer name here!

IP Address : 99.999.99.999

//-----------------------------------//

11:45:26 AM - Successfully captured.

//===================================//

Test 1 : DOMAIN.COMPANYDOMAIN.com

Test 2 : SERVERNAME

Test 3 : SERVERNAME

Test 4 : SERVERNAME

Test 5 : 99.999.99.999

Test 6 : 10 //Also return the same result

更新 :

我现在设法得到答案,答案链接到我在另一篇文章中的答案:

https://stackoverflow.com/a/38953637/1785641

Kelsey 在上面的链接上发布的更新版本:

$(function GetInfo() {
    var network = new ActiveXObject('WScript.Network');
        alert('User ID : ' + network.UserName + '\nComputer Name : ' + network.ComputerName + '\nDomain Name : ' + network.UserDomain);
        document.getElementById('<%= currUserID.ClientID %>').value = network.UserName;
        document.getElementById('<%= currMachineName.ClientID %>').value = network.ComputerName;
        document.getElementById('<%= currMachineDOmain.ClientID %>').value = network.UserDomain;
});

要存储值,请添加以下控件:

<asp:HiddenField ID="currUserID" runat="server" /> <asp:HiddenField ID="currMachineName" runat="server" /> <asp:HiddenField ID="currMachineDOmain" runat="server" />

你也可以像这样从后面调用它:

Page.ClientScript.RegisterStartupScript(this.GetType(), "MachineInfo", "GetInfo();", true);
4

2 回答 2

0

嗯,你设置LocalComputerName

System.Net.Dns.GetHostEntry(
Request.ServerVariables["remote_addr"]).HostName.Split(new Char[] { '.' })

如果您将其更改为:

System.Net.Dns.GetHostEntry(Request.ServerVariables["remote_addr"])

如果您最终获得了 IP 地址,请尝试使用nslookup该地址并查看是否获得了主机名。如果你不这样做,你的问题在于 DNS 解析。

顺便问一下,实际的 IP 地址是否以 开头10.

于 2013-02-18T04:10:48.650 回答
0

我现在快接近了,这是我的 .ascx 文件的代码:

<style type="text/css">
    .hiddenText
    {
        display: none;
    }
</style>
<script type="text/jscript">
<!--
    $(document).ready(function () {
        var net = new ActiveXObject("WScript.Network");
        var vPCName = net.ComputerName;
        document.getElementById('<%= txtPCName.ClientID %>').value = vPCName;
    });
//-->
</script>

这是保存计算机名称的文本框,它应该是隐藏的,但如果它被隐藏它将不起作用。

<asp:TextBox ID="txtPCName" runat="server" />

这是后面的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        Collector();
    }
    protected void Collector()
    {
        if (txtPCName.Text != null || txtPCName.Text != "")
        {
            SPSite spSite = SPContext.Current.Site;
            SPSite spConvSite = new SPSite("https://www.mywebsite.com");
            SPWeb spWeb = SPContext.Current.Web;
            SPWeb spConvWeb = spConvSite.OpenWeb();
            SPUser spUser = spWeb.CurrentUser;

            string strDateLogCreated = DateTime.Now.ToString("ddMMyyyy-hhmmsstt", CultureInfo.InvariantCulture);
            string LogFolder = "D:\\Logs\\Client";
            string[] LocalComputerName = System.Net.Dns.GetHostEntry(Request.ServerVariables["remote_addr"]).HostName.Split(new Char[] { '.' });
            String ecn = System.Environment.MachineName;
            string domainName = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
            string hostName = Dns.GetHostName();
            string strLocalIPAddress = HttpContext.Current.Request.UserHostAddress.ToString();

            StreamWriter swLogFile = File.AppendText(String.Format(@"{0}\Client-{1}.log", LogFolder, strDateLogCreated));

            swLogFile.WriteLine("*** Date & Time : " + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture));
            swLogFile.WriteLine("*** Initiated By : " + spUser.Name.ToString());
            swLogFile.WriteLine("*** LAN ID : " + spUser.LoginName.ToString());
            swLogFile.WriteLine("*** Computer Name : " + txtPCName.Text);
            swLogFile.WriteLine("*** IP Address : " + strLocalIPAddress.ToString());
            swLogFile.WriteLine("---------------------------------------------------");
            swLogFile.WriteLine(DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture) + " - " + "Successfully captured.");
            swLogFile.WriteLine("=====================================================================================================");
            swLogFile.Flush();
        }
    }

But the problem is, txtPCName cannot be hidden either by using Visible="false" or Style="display: none" cause it will not be able to store the value from Javascript to txtPCName. How do I solve this? I cannot let the textbox showing on the page.

于 2013-02-18T06:00:54.057 回答