我的机器上安装了VirtualBox VM,因此有一个为其显示的以太网适配器.我通过以下方式列举了我机器的IP地址列表:
public string GetLocalIpAddress()
{
try
{
string strHostName = Dns.GetHostName();
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
foreach (IPAddress ip in ipEntry.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
return string.Format("({0})", ip.ToString());
}
}
}
catch(Exception e)
{
Global.ApplicationLog.AddApplicationLog(EnumAppEventTypes.SYSTEM_ERROR, e.ToString());
}
return "";
}
Run Code Online (Sandbox Code Playgroud)
我的问题是虚拟机的以太网适配器也符合以下条件:
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
Run Code Online (Sandbox Code Playgroud)
有没有办法挑选我的机器的本地IP地址并忽略我的虚拟机?
我想使用唯一标识符来确定我的应用程序是否移动到另一台计算机.MAC地址似乎适合此目的.我使用的代码是这样的:
Procedure TForm4.GetMacAddress;
var item: TListItem;
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
wmiHost, root, wmiClass: string;
i: Int32;
function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx;//for access to a bind context
Moniker: IMoniker;//Enables you to use a moniker object
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));//Converts a string into a moniker that identifies the object named by the string
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));//Binds to the specified object
end;
begin …Run Code Online (Sandbox Code Playgroud) 好的,所以我使用MAC地址作为唯一标识符,一切顺利,直到我激活VPN并且mac地址改变了.....
所以,我有两个选择:
1)获取实际物理网卡的MAC地址
对于mac地址,我发现了几个如何实现这一目的的提示:
2.)获取主板ID并使用它,并希望我们不会得到2台具有相同ID的计算机(可能吗?)
public String getMotherBoardID()
{
String serial = "";
try
{
ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard");
ManagementObjectCollection moc = mos.Get();
foreach (ManagementObject mo in moc)
{
serial = mo["SerialNumber"].ToString();
}
return serial;
}
catch (Exception)
{
return serial;
}
}
Run Code Online (Sandbox Code Playgroud)
你说什么?我应该尝试挖掘并找到从卡中获取mac地址而不是虚拟地址的代码,还是应该切换到主板?而且我不需要结合任何东西,我只需要在目标计算机上不会轻易改变的东西.