SQL Server hangi ağ kartıyla bağlanmış? [ÇÖZÜLDÜ: WMI, WQL]

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

SQL Server hangi ağ kartıyla bağlanmış? [ÇÖZÜLDÜ: WMI, WQL]

Mesaj gönderen cengaver »

Merhaba Arkadaşlar,

Amacım SQL Server'a yaptığım bağlantıya fiziki bir müdahale olup olmadığını tespit etmek. Yani "fiziki müdahaleden" kastım Network kablosunun çıkarılıp çıkarılmadığını anlamak.

Bunu anlamak için network kartlarının fiilen bağlı olup olmadığını algılamak gerekiyor, ki bunu WMI kullanarak algılayabiliyorum.

Sorunum şu; Bir bilgisayarda birden çok Ağ kartı olduğunda SQL Server bu ağ kartlarından hangisini kullanarak bağlantı sağlamış bunu tespit edemiyorum.

Bu konuda bir fikri, görüşü, önerisi olan var mı? Veya nereleri eşelemeliyim?

Şimdiden teşekkürler,
En son cengaver tarafından 03 Eyl 2014 10:20 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: SQL Server hangi network kartını kullanarak bağlantı kur

Mesaj gönderen G.Arkas »

Her ağ kartı farklı ip adresi alır (yerel). SqlServer connection loglarından bağlanan ip adresini alıp elinizde ki cihazların ip adresiyle karşılaştırabilirsiniz.
Resim
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: SQL Server hangi network kartını kullanarak bağlantı kur

Mesaj gönderen cengaver »

WMI kullanarak sadece network kartının adını bulabiliyorum açıkçası, IP adresini network kartının adından bulacak bir yönteme ihtiyaç var aslında

Kart listesini çektiğim kod aşağıdadır;

Kod: Tümünü seç

uses
     ActiveX, Vcl.Oleauto;

...
implementation
...

function WMI_NetworkKartlariniListele: String;
var
  FSWbemLocator  : OLEVariant;
  FWMIService    : OLEVariant;
  FWbemObjectSet : OLEVariant;
  FWbemObject    : OLEVariant;
  Eleman         : IEnumvariant;
  Indeks         : LongWord;
  NetworkKarti   : String;
begin;
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  FWbemObjectSet := FWMIService.ExecQuery( 'SELECT * FROM Win32_NetworkAdapter WHERE AdapterTypeID = 0'
                                         , 'WQL'
                                         , {wbemFlagForwardOnly} $00000020
                                         );

  Eleman         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

  while  Eleman.Next( 1, FWbemObject, Indeks) = 0 do begin
         NetworkKarti := String( FWbemObject.Caption);
         System.Delete( NetworkKarti, 1, Pos(']', NetworkKarti) );
         Result       := Result + Trim(NetworkKarti) + #13#10;
         FWbemObject  := UnAssigned;
  end;
end;
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: SQL Server hangi network kartını kullanarak bağlantı kur

Mesaj gönderen SimaWB »

Win32_NetworkAdapter sınıfından kartın MAC adresini aldıktan sonra (FWbemObject.MACAddress), yine WMI ile Win32_NetworkAdapterConfiguration sınıfına başvurmalısınız:

Kod: Tümünü seç

FWbemObjectSet:= FWMIService.ExecQuery('SELECT IPAddress FROM Win32_NetworkAdapterConfiguration Where MACAddress="Yukarıda Elde Edilen MAC Adres", 'WQL', wbemFlagForwardOnly);
Böylece kartın IP adresine ulaşırsınız.
There's no place like 127.0.0.1
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: SQL Server hangi network kartını kullanarak bağlantı kur

Mesaj gönderen cengaver »

Tekrar merhaba,

Şu SQL cümlesiyle ağ kartımın IP adresini SQL Server'dan öğrenebiliyorum;

Kod: Tümünü seç

SELECT TOP 1 CLIENT_NET_ADDRESS as [ClientIP] FROM sys.dm_exec_connections WHERE SESSION_ID = @@SPID
Şu SQL cümlesiyle de ağ kartımın MAC adresini yine SQL Server'dan öğrenebiliyorum;

Kod: Tümünü seç

SELECT TOP 1 net_address as [MacAdres] FROM sys.sysprocesses where SPID = @@SPID
Şu kod ile WMI üzerinden verdiğim MAC adresinin ağ bağlantısının olup olmadığını da sorgulayabiliyorum;

Kod: Tümünü seç

// Ornek: ShowMessage(BaglantiVarmi('33:90:44:28:8C:6A')); // Buradaki parametreye kendi ağ kartınızın MAC adresini yazınız...
function BaglantiVarmi(aMacAdres: String): String;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  Eleman        : IEnumvariant;
  iValue        : LongWord;
  aWQL          : String;
begin;
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  aWQL          := format( 'SELECT NetEnabled FROM Win32_NetworkAdapter WHERE NetConnectionID <> %s AND MACAddress = %s', [QuotedStr(Trim('')), QuotedStr(Trim(aMacAdres))]);
  FWbemObjectSet:= FWMIService.ExecQuery( aWQL
                                        , 'WQL'
                                        , wbemFlagForwardOnly
                                        );
  Eleman         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while Eleman.Next( 1, FWbemObject, iValue) = 0 do begin
        try
          Result := Result + String(FWbemObject.NetEnabled);
        except
        end;
        FWbemObject := Unassigned;
  end;
end;
Buraya kadar da sorun yok fakat yukarıdaki kodun aWQL ile başlayan kısmını şöyle değiştirdiğimde ;

Kod: Tümünü seç

  aWQL := 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress = "10:78:D2:CF:56:26"';
ve Try Except bloğunu şu şekilde değiştirdiğimde;

Kod: Tümünü seç

Result := Result + String(FWbemObject.IPAddress);
IPAddress bilgisine ulaşamıyorum. Öyle bir özelliğin olduğuna eminim, zira şu linkteki http://theroadtodelphi.wordpress.com/wm ... e-creator/ WMI Delphi Code Generator denen bir program vasıtasıyla da teyit ettim.

Bu bilgiyi WMI ile buradan okumak için başka ne yapabilirim?
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: SQL Server hangi network kartını kullanarak bağlantı kur

Mesaj gönderen cengaver »

Tamamdır arkadaşlar amacıma ulaştım. Bu konuda yol gösteren, fikir veren tüm arkadaşlara teşekkür etmek isterim. Sonucu sizlerle de paylaşmak istiyorum;

Kodu kısaltmak için kendi kütüphanemde kullandığım bir iki ufak fonksiyon var, onları da ekledikten sonra asıl kodlar bir sonraki kod bloğunda yer alıyor;

Kod: Tümünü seç

function TQ(Const S: String): String; begin Result := QuotedStr(Trim(S)); end;
function _f(const aFormat: String; const aValue: Array of Const): String; begin Result := Format(aFormat, aValue); end;
IP adresinden MAC adresini elde etmek, MAC adresinden IP adresini bulmak, MAC adresinden bağlantı olup olmadığını anlamak için toplamda 5 adet fonksiyon geliştirdim, kullanana hayırlı uğurlu olsun arkadaşlar...

Kod: Tümünü seç

...
uses
    ActiveX, Vcl.OleAuto, ...
...
implementation
...
function BaglantiVarmi(aMacAdres: String): String;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  Eleman        : IEnumvariant;
  iValue        : LongWord;
  aWQL          : String;
begin;
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  aWQL          := _f( 'SELECT NetEnabled FROM Win32_NetworkAdapter WHERE NetConnectionID <> %s AND MACAddress = %s', [TQ(''), TQ(aMacAdres)]);
  FWbemObjectSet:= FWMIService.ExecQuery( aWQL
                                        , 'WQL'
                                        , wbemFlagForwardOnly
                                        );
  Eleman         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while Eleman.Next( 1, FWbemObject, iValue) = 0 do begin
        try
          Result := Result + String(FWbemObject.NetEnabled);
        except
        end;
        FWbemObject := Unassigned;
  end;
end;

function GetIPv4ByMAC(aMacAdres: String): String;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  Eleman        : IEnumVariant;
  iValue        : LongWord;

  Dizi          : Variant;
  Tmp           : String;
begin;
  Result := '';
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  FWbemObjectSet:= FWMIService.ExecQuery( 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = "True"'
                                        , 'WQL'
                                        , wbemFlagForwardOnly
                                        );
  Eleman := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while Eleman.Next( 1, FWbemObject, iValue) = 0 do begin
        Dizi := FWbemObject.IPAddress;
        if (VarIsArray(Dizi) = TRUE) then begin
            Tmp := Dizi[0]; // -> IPv4 !
          //Tmp := Dizi[1]; // -> IPv6 !
        end else begin
            Tmp := Dizi;
        end;

        if (FWbemObject.MACAddress = aMACAdres) then begin
            if (Tmp <> '') then Result := Result + Tmp + ' ';
        end;
        FWbemObject := Unassigned;
  end;
  Result := Trim(Result);
end;

function GetIPv6ByMAC(aMacAdres: String): String;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  Eleman        : IEnumVariant;
  iValue        : LongWord;

  Dizi          : Variant;
  Tmp           : String;
begin;
  Result := '';
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  FWbemObjectSet:= FWMIService.ExecQuery( 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = "True"'
                                        , 'WQL'
                                        , wbemFlagForwardOnly
                                        );
  Eleman := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while Eleman.Next( 1, FWbemObject, iValue) = 0 do begin
        Dizi := FWbemObject.IPAddress;
        if (VarIsArray(Dizi) = TRUE) then begin
          //Tmp := Dizi[0]; // -> IPv4 !
            Tmp := Dizi[1]; // -> IPv6 !
        end else begin
            Tmp := Dizi;
        end;

        if (FWbemObject.MACAddress = aMACAdres) then begin
            if (Tmp <> '') then Result := Result + Tmp + ' ';
        end;
        FWbemObject := Unassigned;
  end;
  Result := Trim(Result);
end;

function GetMACbyIPv4(aIPv4Adres: String): String;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  Eleman        : IEnumvariant;
  iValue        : LongWord;
  aWQL          : String;

  Dizi          : Variant;
  Tmp           : String;
begin;
  Result := '';
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  aWQL := 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = "True"';
  FWbemObjectSet:= FWMIService.ExecQuery( aWQL
                                        , 'WQL'
                                        , wbemFlagForwardOnly
                                        );
  Eleman        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  Result := '';
  while Eleman.Next( 1, FWbemObject, iValue) = 0 do begin
        Dizi := FWbemObject.IPAddress;
        if (VarIsArray(Dizi) = TRUE) then begin
            Tmp := Dizi[0]; // -> IPv4 !
          //Tmp := Dizi[1]; // -> IPv6 !
        end else begin
            Tmp := Dizi;
        end;

        if (Pos(aIPv4Adres, Tmp) > 0) then begin
            Result := FWbemObject.MACAddress;
            FWbemObject := Unassigned;
            Exit;
        end;
        FWbemObject := Unassigned;
  end;
end;

function GetMACbyIPv6(aIPv6Adres: String): String;
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  Eleman        : IEnumvariant;
  iValue        : LongWord;
  aWQL          : String;

  Dizi          : Variant;
  Tmp           : String;
begin;
  Result := '';
  FSWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService    := FSWbemLocator.ConnectServer( {WbemComputer} 'localhost'
                                               , {NameSpaces}   'root\CIMV2'
                                               , {WbemUser}     ''
                                               , {WbemPassword} ''
                                               );
  aWQL := 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = "True"';
  FWbemObjectSet:= FWMIService.ExecQuery( aWQL
                                        , 'WQL'
                                        , wbemFlagForwardOnly
                                        );
  Eleman        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  Result := '';
  while Eleman.Next( 1, FWbemObject, iValue) = 0 do begin
        Dizi := FWbemObject.IPAddress;
        if (VarIsArray(Dizi) = TRUE) then begin
          //Tmp := Dizi[0]; // -> IPv4 !
            Tmp := Dizi[1]; // -> IPv6 !
        end else begin
            Tmp := Dizi;
        end;

        if (Pos(aIPv6Adres, Tmp) > 0) then begin
            Result := FWbemObject.MACAddress;
            FWbemObject := Unassigned;
            Exit;
        end;
        FWbemObject := Unassigned;
  end;
end;
Cevapla