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,
SQL Server hangi ağ kartıyla bağlanmış? [ÇÖZÜLDÜ: WMI, WQL]
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
SQL Server hangi ağ kartıyla bağlanmış? [ÇÖZÜLDÜ: WMI, WQL]
En son cengaver tarafından 03 Eyl 2014 10:20 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Re: SQL Server hangi network kartını kullanarak bağlantı kur
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.
Re: SQL Server hangi network kartını kullanarak bağlantı kur
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;
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;
Re: SQL Server hangi network kartını kullanarak bağlantı kur
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:
Böylece kartın IP adresine ulaşırsı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);
There's no place like 127.0.0.1
Re: SQL Server hangi network kartını kullanarak bağlantı kur
Tekrar merhaba,
Şu SQL cümlesiyle ağ kartımın IP adresini SQL Server'dan öğrenebiliyorum;
Şu SQL cümlesiyle de ağ kartımın MAC adresini yine SQL Server'dan öğrenebiliyorum;
Şu kod ile WMI üzerinden verdiğim MAC adresinin ağ bağlantısının olup olmadığını da sorgulayabiliyorum;
Buraya kadar da sorun yok fakat yukarıdaki kodun aWQL ile başlayan kısmını şöyle değiştirdiğimde ;
ve Try Except bloğunu şu şekilde değiştirdiğimde;
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?
Ş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
Kod: Tümünü seç
SELECT TOP 1 net_address as [MacAdres] FROM sys.sysprocesses where SPID = @@SPID
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;
Kod: Tümünü seç
aWQL := 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress = "10:78:D2:CF:56:26"';
Kod: Tümünü seç
Result := Result + String(FWbemObject.IPAddress);
Bu bilgiyi WMI ile buradan okumak için başka ne yapabilirim?
Re: SQL Server hangi network kartını kullanarak bağlantı kur
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;
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...
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;
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;