【问题标题】:Is it possible to get the mac address using a stored procedure?是否可以使用存储过程获取mac地址?
【发布时间】:2011-03-24 19:53:11
【问题描述】:

想知道是否可以使用存储过程获取服务器的 MAC 地址? 我做了一些搜索,但一无所获。这是使用 SQL2008。

更新
不幸的是,使用 newsequentialid() 的答案可能会返回错误 如果服务器上有 VMWare,则为 MacAddress。

【问题讨论】:

  • 如果有两张网卡会怎样?
  • 我要把它们全都拿走。

标签: sql-server stored-procedures


【解决方案1】:
DECLARE @IP_Address varchar(20);
DECLARE @mac_Address varchar(20);

SELECT @IP_Address=client_net_address,@mac_Address=net_address 
    FROM sys.dm_exec_connections c
    join sys.sysprocesses p on c.session_id=p.spid
    WHERE c.Session_id = @@SPID

【讨论】:

  • 完全一样:select net_address from sysprocesses where spid = @@SPID 。这不会给出 MAC 地址,而是给出其他一些网络地址(我检查过)
【解决方案2】:

声明@macadd nvarchar(50) 选择@macadd=net_address 来自 master.dbo.sysprocesses 其中 program_name like 'SQLAgent%' 和 hostname=SERVERPROPERTY('MachineName') 和 net_address'000000000000' --获取MAC地址集@macadd=SUBSTRING(@macadd,1,2)+'-'+SUBSTRING(@macadd,3,2)+'-'+SUBSTRING(@macadd,5,2)+'- '+SUBSTRING(@macadd,7,2)+'-'+SUBSTRING(@macadd,9,2)+'-'+SUBSTRING(@macadd,11,2) --要在MAC地址的每两个字符之间包含'-',请选择@macadd

【讨论】:

    【解决方案3】:

    一个有点绕的方法!

    declare @t table
    (
    i uniqueidentifier default newsequentialid(),
    m as cast(i as char(36))
    )
    
    insert into @t default values;
    
    select
        substring(m,25,2) + '-' + 
        substring(m,27,2) + '-' + 
        substring(m,29,2) + '-' +
        substring(m,31,2) + '-' +
        substring(m,33,2) + '-' +
        substring(m,35,2) AS MacAddress
    FROM @t
    

    【讨论】:

    • 它就像一个魅力,但我仍然不明白它是如何得到它的。我明白了,newsequentialid 使用 mac 地址。顺便谢谢你。
    • 不幸的是,如果服务器上有 VMWare,newsequentialid() 会返回错误的 MacAddress。
    • @Donny - 啊,老实说,无论如何我都觉得依赖它有点不舒服。我猜算法在未来的某个时候可能会在没有警告的情况下发生变化。
    • @MartinSmith,我关注了你的查询,但昨天它给了我“85-61-27-27-FF-A7”的值,现在当我检查它时,它会生成“B8-CA- 3A-D0-2C-6F”。问题是什么?有什么东西可以贯穿始终吗?
    【解决方案4】:

    sys.sysprocesses,net_address 列。对于我与 SSMS 的连接,它是 795C70BAD9B0

    sys.dm_exec_connections 中没有等效项(net_address 是 IP 地址而不是 MAC 地址,并且是来自我的 SSMS 的 111.222.111.222)。其实没有sys.sysprocesses equivalent either

    所以你可以在你自己的存储过程中查询 sys.sysprocesses...

    【讨论】:

    • 但这是客户端连接服务器的地址,不一定是从同一台机器连接。据我所知,内部系统进程没有填充该列。
    【解决方案5】:

    我猜你需要从 SQL 执行 shell 命令来获取 MAC 地址。如果我没记错的话,您必须先打开执行 shell 命令选项,然后才能使用它。然后,您可以运行“getmac”来检索服务器上接口的 MAC 地址列表。您必须按照自己的方式处理返回的文本,但这应该不会太难。

    【讨论】:

      【解决方案6】:

      好吧,因为在 Sql Server 2008 中,存储过程可以包含托管代码,所以应该有可能,但是,从技术上讲,您应该运行由 SqlServer 启动的 ac#/vb 应用程序,而不是真正从一个存储过程,虽然这更多的是理论而不是实际的区别。

      【讨论】:

      • 托管过程存储过程,该术语在技术上涵盖了 T-SQL 和 CLR。而且也没有“SQL Server 启动的应用程序”,SQL Server 本身就是一个 CLR 主机,它不会启动应用程序来运行托管代码。
      • 当然,我的措辞很糟糕。怎么样“SQL 没有进入这个解决方案,所以它不是传统意义上的存储过程,但它运行起来像一个”
      • 其实这行不通,因为你需要创建一个SQLServerProject来部署和调试CLR存储过程。 SQLServerProject 不支持 System.Managment。
      • 您不需要 System.Management。您需要可用的 System.Net.NetworkInformation。
      • 查看这个问题stackoverflow.com/questions/151231/…(跳过已接受的答案并阅读下一个或我的进一步向下)
      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2011-07-19
      • 2012-10-24
      相关资源
      最近更新 更多