Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual Basic => Konuyu başlatan: EMG81 - 27 Aralık 2010, 23:56:29

Başlık: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 27 Aralık 2010, 23:56:29
Öncelikle herkese selamlar

Arkadaşlar vb6 da hdd seri numarası, cpu seri numaralarını öğrenebiliyordum. Visual Studio ya geçiş yaptım ve ardından Nette bir ton aramalar yaptım.  (Studio da yeni olduğumdan belki gözümden kaçmış olabilir) Fakat bu tarz uygulamalara raslayamadım. Visual studio 2010 da hdd veya cpu seri numaralarını nasıl öğrenebilirim ?

Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: Burak B - 28 Aralık 2010, 06:51:28
Win32 API - GetVolumeInformation
ASM  -  CPUID komutu

Bu ikisini araştır. Ayrıca bu ikiliyi eğer programını korumak için kullanacaksan kırılması 30 dakka sürmez.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 28 Aralık 2010, 18:40:28
Değerli yanıtınız için çok teşekkür ederim. Nette tekrardan aramalar yaptım, birkaç örnek gördüm fakat başarılı olamadım.

Evet programı korumak için kullanıcam fakat sistemi şu şekil düşündüm. CPU veya HDD numarasını programın her açılışında sistemden çekicem. Atıyorum   (hdd no *2) / (224-200)  birşey yaptırıcam. Ayrıca bu işlemin tam tersini yapan bir programım vasıtasıyla her farklı pc ye kurulan program için bir kod oluşturucam. bu kod vasıtasıyla eşleştirme yaptırıcam.  Bu şekil kırılabilirmi ?

Son olarak Visual net te çok yeniyim. O yüzden bazı şeyleri anlamakta şuanlık çok güçlük çekiyorum. Daha detaylı anlatırsanız çok sevinirim. Kolay gelsin.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 28 Aralık 2010, 18:59:43
EXE debug edilip bu check işleminin yapıldığı satırlar atlatılırsa kırılmış olur. Bu işlemi yapan hazır kırıcı prog. lar var.  Debug anında bu satırdan değilde şu satırdan devam etmesini söylemenin mümkün olduğu ve programda izlenen yola göre otomatik olarak exe üzerinde gerekli değişikliği yapan debuggerlar var. Bu şekilde bir koruma, ancak yazdığınız prog. geniş kitlelere hitap etmiyorsa, çok yüksek bir değeri yoksa yada herhangi biri bunu kırmayı kafaya koymamışsa etkili olur.

Kopya ve kırılmasını engelleme amaçlı olarak da exe'yi şifreleyen, ilk çalışma anında sistemde kernel mod debugger vs. yüklü ise çalışmayan yoksa exe'yi açıp programınızı  çalıştıran uygulamalarda mevcut. 
Net bir uygulama adı isterseniz maalesef hatırlamıyorum. Bilgim 4-5 yıl kadar önce kod güvenliği, kopyalama nasıl engellenir gibi basit bir araştırma  sonucunda öğrendiklerimden ibaret.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 28 Aralık 2010, 19:06:57
Yanıtınız için teşekkür ederim. Öyle geniş kitlelere hitab eden birşey değil. Fakat dün geceden beri kafayı yiyeceğim. Hdd yada cpu seri nosunu alamadım ...
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 28 Aralık 2010, 19:10:57
VB6 da nasıl yapıyorsunuz bilmiyorum. Sanırım VB6 da bir dll vs. çağırarak yapıyorsunuzdur. Aynı şekilde .NET de de bir dll çağırmak mümkün. .NET de daha zor olmaması gerekli diye düşünüyorum.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 28 Aralık 2010, 19:17:05
Evet sanırım öyle birşeydi. bende Net. de daha kolay ve hızlı olduğunu düşünüyorum. Umarım yardımlarınız sayesinde yapabilirim...
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: sigmoid - 28 Aralık 2010, 19:40:17
İnternette yaptığım aramalar sonucunda bulduklarım.

http://www.codeproject.com/KB/system/GetHardwareInformation.aspx

http://www.csharpnedir.com/forum2/printer_friendly_posts.asp?TID=12997

http://social.msdn.microsoft.com/forums/en-US/Vsexpressvcs/thread/7003d7ae-90b5-41d0-b113-67e9301c8eec/

Düzeltme: OPs ben aramamı c# üzerine yapmıştım. Konunun sonradan Visual Basic içinde açıldığını fark ettim. Google da how to get hdd serial numbers in vb.net şeklinde ararsınız bir çok kod bulabilirsiniz.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 28 Aralık 2010, 21:40:33
yanıtınız için teşekkür ederim abdullah bey basic bilgim iyi fakat c# bilgim yok denecek kadar az. Nette tekrardan aramalar yaptım ve bir kod u çalıştırmayı başardım. Fakat birşey dikkatimi çekti. HDD seri numarası :5A545D788T545G gibi Harfli birşeyler olması gerekirken bende sadece 1564648746 şeklinde rakamlar çıkıyor. Başka bir pc de denedim ondada sadece 0 çıkıyor. Kodlar ;



Public Class Form1


    Dim tmpStr2 As String = ""

    Dim myScop As New Management.ManagementScope("\\" & Environment.MachineName & "\root\cimv2")

    Dim oQuer As New Management.SelectQuery("SELECT * FROM WIN32_DiskDrive")

    Dim oResult As New Management.ManagementObjectSearcher(myScop, oQuer)

    Dim oIte As Management.ManagementObject

    Dim oPropert As Management.PropertyData

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each oIte In oResult.Get()

            For Each oPropert In oIte.Properties

                If Not oPropert.Value Is Nothing AndAlso oPropert.Name = "Signature" Then

                    tmpStr2 = oPropert.Value.ToString

                    Exit For

                End If

            Next

        Next

        TextBox1.Text = (tmpStr2)
    End Sub
End Class
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: Digimensch - 28 Aralık 2010, 22:47:32
Visual Studio 2010  C# ile söyle birsey karaladim insallah isine yarar
using System;
using System.Collections.Generic;
using System.Management;
using System.Linq;
using System.Text;

namespace HDD_Serial_Nummer
{
    class Program
    {
        //CPU Seri Numarasi icin gerekli Method
        public static string GetCPUId()
        {
            string cpuInfo = String.Empty;
            string temp = String.Empty;
            ManagementClass mc = new ManagementClass("Win32_Processor");
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {
                if (cpuInfo == String.Empty)
                {
                    cpuInfo ="\nCPU Serial Numarasi:"+ mo.Properties["ProcessorId"].Value.ToString();
                }
            }
            return cpuInfo;
        }

          static void Main(string[] args)
        {

           int adet = 1;
            try
            {
                ManagementObjectSearcher Sucher = new ManagementObjectSearcher("root\\CIMV2","SELECT * FROM Win32_DiskDrive");
           
                  foreach (ManagementObject queryObj in Sucher.Get())

            {
                Console.WriteLine("-----------------------------------");
                Console.WriteLine((adet++)+".HDD");
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("Marka: {0}", queryObj["Caption"]);
                Console.WriteLine("Interface Tip: {0}", queryObj["InterfaceType"]);
                Console.WriteLine("Serial Numarasi: {0}", queryObj["SerialNumber"]);
            }
                  Console.WriteLine(GetCPUId());
        }
                 catch (ManagementException e)
                {
                    Console.WriteLine("Hata olustu:" + e.Message);
                  }
           
            Console.ReadLine();
}

    }
}
         
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 28 Aralık 2010, 23:19:26
Vakit ayırıp yorum yazdığın için çok teşekkür ederim ama C ile sadece led yakıp söndürecek kadar pic programlıyabiliyorum. İşin Visual C olayına çok uzağım. yani Ufo görmüş masum köylü gibiyim. yazdığım programda Basic dilinde ve program hazır gibi sadece HDD kodu ile giriş yapma kısmı kaldı. Ama şuda var ki C öğrenme çabalarım yılmadan sürekli devam etmekte. Birkaç aya kadar Visual C ye geçmeyi düşünüyorum. Değerli yanıtın için Tekrardan teşekkür ettim...
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: Digimensch - 28 Aralık 2010, 23:33:47
VB.NET'e  herhalde bir ceviren arkadas olur olur.
Sadece su Method isine yariyacak....

using System.Manegement; // bu uzayi dahil etmeyi unutma

//String türünde veri döndüren Method istedigin yerden cagir
public static string GetCPUId()       
{           
string cpuInfo = String.Empty;           
string temp = String.Empty;           
ManagementClass mc = new ManagementClass("Win32_Processor");           
ManagementObjectCollection moc = mc.GetInstances();           
foreach (ManagementObject mo in moc)           
{               
if (cpuInfo == String.Empty)               
{                   
cpuInfo =mo.Properties["ProcessorId"].Value.ToString();               
}           
}           
return cpuInfo;       
}

Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 29 Aralık 2010, 03:29:40
Çoğu çevirici  "line 4 col 15: invalid TypeDecl" hatası verdi.
linktekini kullanınca
http://www.carlosag.net/Tools/CodeTranslator/ (http://www.carlosag.net/Tools/CodeTranslator/)

bunu verdi..
Imports System.Manegement

   
    ' bu uzayi dahil etmeyi unutma
    'String t�r�nde veri d�nd�ren Method istedigin yerden cagir
    Public Shared Function GetCPUId() As String
        Dim cpuInfo As String = String.Empty
        Dim temp As String = String.Empty
        Dim mc As ManagementClass = New ManagementClass("Win32_Processor")
        Dim moc As ManagementObjectCollection = mc.GetInstances
        For Each mo As ManagementObject In moc
            If (cpuInfo = String.Empty) Then
                cpuInfo = " mo.Properties["
                ProcessorId
                "].Value.ToString();              "
            End If
        Next
        Return cpuInfo
    End Function
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 29 Aralık 2010, 23:17:18
hata verdi yada ben yapamadım...
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: kudretuzuner - 29 Aralık 2010, 23:32:46
Merhaba
Ben size şöyle yardımcı olabilirim.Volkan Aktaş'ın VB Net 10 adlı kitabında 467 nci sayfadan itibaren "windows API lerini kullanma" adlı bir bölüm var çok kapsamlı anlatıyor.Ben de yeni yeni öğrenmeye başladığım için size ancak bu kadar yardımcı olabildim.Kolay gelsin.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 30 Aralık 2010, 00:31:38
Yanıtınız için teşekkür ederim Kudret bey. Sanırım elinizde bahsettiğiniz kitap mevcut. Şayet böyle ise sizden ricam kitap index inden HDD veya CPU nosu öğrenme ile ilgili bir başlık olup olmadığına bakarmısınız ?
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 30 Aralık 2010, 01:01:57
http://www.codeproject.com/KB/system/GetHardwareInformation.aspx (http://www.codeproject.com/KB/system/GetHardwareInformation.aspx)
Ekteki örnek oldukça detaylı bilgi veriyor. c#,  ama bir translator ile vb ye çevrilebilir.

Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: lojikmemo1 - 30 Aralık 2010, 01:33:54
API değil de WMI diye bişi var bunun içinde isteğnizden fazlası olacaktı..
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 30 Aralık 2010, 02:05:24
Visual Studio da çok yeniyim... O nedenle WMI yı biraz açabilirmisiniz ?
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: lojikmemo1 - 30 Aralık 2010, 19:21:54
Bu makalede...

WMI (Windows Management Instrumentation) Microsoft Windows işletim sistemlerinde var olan en önemli yapılardan biridir. WMI, en temel kullanımı ile, sistemin sorgulanmasına ve sistem temel operasyonların programatik olarak yönetilmesine yardımcı olabilecek ama yetenekleri de sadece bunlarla sınırlı olmayan bir yapı sunmaktadır. Bu makale ve ekte sunacağım örneklerde basit bir konu seçerek, local makine ve bağlı bulunduğu network (Active Directory yapısı) üzerinden aynı ağdaki farklı bir makinede çalışan process'lerin listesine nasıl ulaşılacağı ve hatta yetkili kullanıcı olunması halinde bu process'lerin nasıl öldürüleceğini anlatmaya çalıştım, tabii bütün bunları .NET Framework 2.0 üzerinde C# ve WMI kullanarak yapmaya çalıştım.


çok güçlü bir namespace; System.Management

Genelde programcılar ve yazılım mimarları tarafından çoğu projede gözardı edilebilen bu güçlü namespace adından da anlaşılacağı gibi sistemin durumu, logları, başarımı ve yönetilmesi ile ilgili temel sınıfları içeren bir kütüphane olarak düşünülebilir. Ama dikkat edilecek husus bu namespace'in yetkinliklerinin System.Diagnostics namespace' i içerisindeki sınıflarla karıştırılmamasıdır. O, apayrı bir konudur ve burada biz Diagnostics namespace' i ile ilgilenmiyor olacağız.

System.Management namespace' i içerisindeki en önemli sınıflardan biri kuşkusuz ManagementObject sınıfıdır. (Tam adı ile System.Management.ManagementObject). Bu nesnenin detaylı bir incelenmesi çabasına girmeden once bu sınıfın, ICloneable interface' ini implement ettiğine dikkatinizi çekmek isterim. ICloneable interface' ini daha önce kullanmış olanlar bilirler, bu interface' i implement eden sınıflar sanki birer value type' mış gibi kopyalanabilirler ki bu bir nesnenin referansının değil ama değerlerinin farklı fonksiyonlar, sınıflar ve yeri geldiğinde Application Domain' ler arasında transfer edilebilmesine imkan tanır. Bu işlemler ise dağıtık uygulamalar konusu ile ilgili olup bu makalenin ilgi alanı dışındadır. Fakat son olarak, ilgilenenler için, söz konusu sınıfın ISerializable interface' ini implement ettiğini de belirtelim, yani bu nesne Serialize edilebilen bir nesnedir ve serialize ederek anlık state' ini bir stream üzerinde saklmak mümkündür.

Dikkat edilecek yegane husus ise, ManagementObject sınıfı yönetim için bir taban sınıfı deklare ettiğinden (esasında bunu taban sınıfı da ManagementObjectBase sınıfıdır), tüm yönetimsel işlemlerin kalbi denilebilecek kadar önem taşımasıdır. Başka bir değişle ManagementObject sınıfı kullanılarak işlemler yürütülmektedir.

Bunun yanı sıra WMI sistemi bir ağaç yapısına sahiptir. Bunun anlamı sistemin neresine erişilmek isteniyorsa orayı gösteren bir path vasıtası ile gerekli işlemler ve sorgular çalıştırılmalıdır. Nasıl Windows dizinindeki sample.txt adlı bir dosyayı silmek için c:\Windows\ dizini kullanılacaksa, WMI path' leri de ulaşılmak istenilen yönetimsel aracın yolunu belirtecek şekilde düzenlenmelidir. Aşağıdaki satırda local makine üzerindeki process bilgileri için kullanacağımız path örnek olarak verilmiştir. Buradaki path kavramını namespace kavramı gibi de düşünmek mümkündür ve esasında hiçbir farkı yoktur.

\\localhost\root\cimv2

Bir diğer temel öğe ise WMI işlemlerinin, daha doğrusu sorgularının alışılagelmiş SQL sorguları ile yapısal olarak aynı sözdizimi ve anahtar kelimleri kullandığıdır. Tabii ki, bir yazılım sisteminin öğeleri tablolar olmadığından tabloların yerlerini özel nesnelerin isimleri almaktadır. Örneğin sistemdeki tüm process' lerin tüm özelliklerini sorgulamak için aşağıda verilen sorgu cümleciği kullanılabilir:

SELECT * FROM Win32_Process

Bu sorgunun klasik bir SQL sorgusuna ne kadar benzediği kuşkusuz kullanıcının dikkatini çekecetir. Dolayısı ile, şu ana kadar, WMI path ile ulaşcağımız bilginin yerini, SQL benzeri sorgu ile de bu yerden istediğimiz bilgiyi alabileceğimiz gösterilmiştir.


En Temel bilgiler...

Yukarıda anlatılanların ışığında bize bazı temel bilgiler gerekeceği gözükmektedir:

1. Process' leri hangi path (namespace) üzerinden arayacağız (ulaşacağız)
2. Bütün bunları uzak bir makine üzerinde nasıl yapacağız.

İlk sorunun cevabı oldukça kolay. Konu ile ilgili daha detaylı bilgiye MSDN üzerinden ulaşabilirsiniz. Bizim örnek uygulamamızda kullanacağımız CIMV2 adlı namespace, local Windows sistemi üzerinde sorgu ve işlemleri yapabileceğimiz bir sınıflar kümesi barındırmaktadır. Dolayısı ile erişmek istediğimiz alan "\\<Makine_Adı>\root\cimv2" olarak kullanılacaktır. Bir diğer soru sisteme bunu nasıl anlatabiliriz?

İşte bu noktada System.Management.MangementScope adlı bir sınıf imdadımıza yetişmektedir. Yapılacak işlemlerin hangi sınıf kümesi (namespace ya da path olarak da düşünebilirsiniz) üzerinde yapılacağını bu sınıfı kullanarak belirtebiliriz. Örneğin:

ManagementScope scope = new ManagementScope(@"\\localhost\root\cimv2");

Yukarıdaki tanımlama "scope" olarak localhost adlı makine üzerinde root\cimv2 kümesinin elamanlarının kullanılacağını belirtmektedir.

Bir diğer soru işareti ise olası bir durumda, mesela uzaktaki bir makineye bağlanılması, kullanıcı bilgilerinin diğer makineye nasıl aktarılacağı olabilir. Varsayılan değer olarak aktif olarak sistemde bulunan kullanıcı bilgilerinin ve kısıtlarının ışığında karşı tarafa bu bilgilerin gittiğini yani logon olmuş kullanıcının kimlik bilgileri (credentials) ile uzak makinede oturum açmaya çalıştığını çoğumuz zaten biliyoruz. Örneğin ben çalıştığım domain üzerinde Administrator yetkilerim olmasına karşılık Domain Admin yetkisi olmayan farklı bir kullanıcı ile sisteme logon olmayı terchi ediyorum. Dolayısı ile uzak makinede bir işlem yapmak istediğimde Domain Admin şapkamı takmalı ve o şapka altında işlerimi yürütmeliyim. İşte böyle bir durumda da System.Management.ConnectionOptions sınıfı oldukça kullanışlı olmaktadır. İsminden de anlaşılacağı üzere herhangi bir bağlantı esnasında kullanmak istediğiniz ayarları bu sınıf ile sisteme bildirebilirsiniz. Örneğin:

ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.Impersonate;
options.Username = "<domain_name>\\<user_name>";
options.Password = "<password>";

Burada en önemli property muhtemelen Impersonation olacaktır. Impersonation işlemi kullanıcı bilgilerinin varolan application domain sınırlarından başka application domainlere ulaştırılarak farklı uygulamalar arasında kimlik paylaştırılması olarak düşünülebilir. Impersonation.Impersonate enumeration değeri ise söz konusu olan bağlantı ayarlarının impersonate edileceğini, yani uzaktaki sisteme bağlanılırken verilen kullanıcı adı ve şifresinin kullanılarak bağlanılacağını bildirmektedir.

Şimdi yukarıdaki ManagementScope ile ConnectionScope sınıflarını birleştirmek istersek:


ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.
options.Impersonation = ImpersonationLevel.Impersonate;
options.Username = "domain\\user";
options.Password = "SomePassword";

ManagementScope scope = null;
scope = new ManagementScope("\\ComputerName\root\cimv2", options);

Bu kod parçacığı ComputerName adlı sisteme, verilen kimlik bilgileri ile bağlanarak, o sistemdeki \root\cimv2 WMI namespace' ine ulaşmak amacı ile kullanılacak olan scope adlı bir değişken tanıtmaktadır.

Tüm örnek koda göz atmadan önce son olarak iki sınıftan daha bahsetmek yerinde olur. Bunlar da sırası ile ObjectQuery ve ManagementObjectSearcher sınıflarıdır. Yüzeysel olarak bu sınıfların işlevlerine de değinmek gerekirse; ObjectQuery sınıfı ManagementObject'leri içerisinden arama yapmak yani bir sorgu çalıştırmak için gerekli olan komutu içeren bir yapı tanımlar. Bunu sınıfı ADO.net kütüphaneleri içerisinde bulunan Command sınıflarına benzetebiliriz.

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process");

Yukarıdaki bu tanımlama verilen sorgu cümlesini içeren bir sorgu nesnesi yaratmamızı sağlamaktadır. Bu sorgular klasik SQL cümleleri gibi WHERE koşulu da içerebilir. Bir başka örnek;

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process WHERE ProcessID = '1263'");

şeklinde olabilir. Bu sayede sistem 1263 numaralı ID'ye sahip process'i arayıp bulmaya çalışacaktır.

ManagementObjectSearcher nesnesi ise verilen path (namespace) üzerinde verilen sorgu nesnesini çalıştırmakla yükümlüdür. Bununla beraber sonuçlarını , tabii ki, ADO.net'den alışıldığı üzere DataTable veya DataSet gibi nesnelerle değil yine ManagementObject olarak döndürür. Her sorgu muhakkak ki sıfır ila sonsuz tane cevap döndürecektir, dolayısı ile sonuçlar tek bir nesne değil nesneler topluluğu yani Collection olarak döndürülür. ManagementObject sınıflarından oluşan bu topluluğa ManagementObjectCollection adı verilmektedir. İsminden de anlaşılacağı gibi, zaten bu nesne (ManagementObjectSearcher) ManagementObject' lerini aramakla yükümlüdür, yani verilen sorgudaki kriterlere uyan nesneleri döndürecektir. Aşağıdaki örnekte konu ile ilgili örnek kod bloğu verilmiştir.

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection result = searcher.Get();

Bu temel bilgilerin ardından örnek kodu incelemek yerinde olacaktır sanırım.

Örnek Uygulama

Öncelikle uygulamamızda kullanacağımız sınıflarımıza bir bakalım. Form1 adlı sınıf uygulamanın kullanıcı arabirimini oluşturan standart bir Form sınıfıdır. Yapılan işleleri arka tarafta çalışacak olan ProcWMI sınıfına iletmekten başka bir işlevi yoktur.

Bunun yanı sıra ProcessInfo sınıfı, her bir process hakkinda bizim uygulamamızda kullanılacak olan bilgileri içeren (esasında enkapsüle eden) bir sınıf olarak tasarlanmıştır. ID olarak sistemdeki process' in ID'si, Memory olarak process' in kullandığı bellek miktarı, Name olarak da process' I tanımlayan isim değerleri kullanılacaktır. ProcessInfoCollection ise ProcessInfo sınıflarını eleman olarak kabul eden bir Collection sınıfından ibarettir. Kodlara bakacak olursanız bu sınıfın CollectionBase sınıfından türediğini göreceksiniz.


Şekil 1 – Sınıf Tanımlamaları

Şimdi gelelim esas yükü sırtlanan ProcWMI sınıfına; bu sınıf iki temel property sunar, bunlar sırası ile Credentials ve ComputerName adlı property' lerdir. Credentials property' si kullanıcı uzak makinelere eğer farklı bir kimlik kullanarak bağlanmak istiyorsa kullanacağımız değerleri verir. Bu değerler, Domain adı, Kullanıcı Adı ve Şifresidir. ComputerName ise IP veya isim olarak bağlanılacak sistemi tanıtmaya yarar. Bu property' nin varsayılan değeri "localhost" olarak ayarlanmıştır.

IsLocal methodu verilen bilgisayar adı ve / veya IP' sinin lokal makine olup olmadığını sorgular. Eğer verilen yol lokal ise true aksi taktirde false döndürür ve private bir method' dur.

private bool IsLocal()
{
return (this.m_ComputerName == "localhost" || this.m_ComputerName == "." ||
this.m_ComputerName == "127.0.0.1" || this.m_ComputerName ==
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[0].ToString()
||
this.m_ComputerName.ToLower() == Dns.GetHostName().ToLower());
}

GetScope methodu ise verilen Credentials ve ComputerName property' leri vasıtasıyla ve verilen adresin lokal makine olup olmadığını kontrol ederek ilgili makinenin ilgili WMI namespace' ini kullanan bir path'i kullanarak bir ManagementScope nesnesi yaratır ve bu nesneyi geri gönderir. Dikkat edilirse verilen credentials sadece uzak makine bağlantılarında kullanılmak üzere ayarlanmıştır.

private ManagementScope GetScope(){
ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.Impersonate;
options.Username = this.m_Credentials.Domain + "\\" + this.m_Credentials.UserName;
options.Password = this.m_Credentials.Password;

ManagementScope scope = null;

if (IsLocal())
scope = new ManagementScope("\\\\" + this.m_ComputerName + "\\root\\cimv2");
else
scope = new ManagementScope("\\\\" + this.m_ComputerName + "\\root\\cimv2", options);

return scope;
}

Bir diğer önemli method ise ExecuteQuery methodudur. Bu method parametre olarak string tipinde bir değişken (sorgu cümlesi) alır ve GetScope methodunu çağırarak elde ettiği scope üzerinde bu sorguyu çalıştırır ve elde ettiği ManagementObjectCollection tipindeki cevapları geri döndürür.

private ManagementObjectCollection ExecuteQuery(string queryText){
ManagementScope scope = this.GetScope();
ObjectQuery query = new ObjectQuery(queryText);
ManagementObjectSearcher searcher = new
ManagementObjectSearcher(scope, query);
ManagementObjectCollection result = searcher.Get();

return result;
}

Son olarak verilen process' leri öldürecek olan KillProcess adlı metodumuza bir göz atalım. Bu method parameter olarak process' in ID' sini almaktadır. Bilindiği üzere işletim sistemi üzerinde koşan her process' e tekil bir ID otomatik olarak verilmektedir. Aşağıda bu metodun kodları verilmiştir:
public void KillProcess(int procID){
ManagementObjectCollection results = this.ExecuteQuery("SELECT * FROM
Win32_Process WHERE ProcessID = '" + procID.ToString() + "'");

foreach (ManagementObject process in results){
ManagementBaseObject param =
process.GetMethodParameters("Terminate");
param["Reason"] = 1;
process.InvokeMethod("Terminate", param, null);
}
}

Burada dikkat edilirse metod önce ExecuteQuery fonksiyonunu çağırarak gerekli process' in varolup olmadığına bakmaktadır. Ardından bulunan sonuçlar arasından, ki ya hiç bulunmayacak ya da 1 tane bulunacaktır, tüm process' lere "Terminate" sinyali gönderilecektir. ManagementBaseObject sınıfının GetMethodParameters fonksiyonu istenilen bir WMI methodunun parametrelerini bize dödürmektedir. Bu örnekte Terminate fonksiyonunun parametreleri istenilmektedir. Bu parametrelerden bir tanesi çok önem kazanmaktadır, Reason. Çünkü system bizden bir process' I hangi sebeple öldürmek istediğimizi soracaktır. Bunun yanı sıra param adlı değişken, yani fonksiyonun parametrelerini refere eden deişkenimizin sanki bir HashTable yapısı gösterdiğine dikkatinizi çekmek isterim. Bu sayede param nesnesinin Reason indexer' ı ile refere edilen değeri 1 olarak set edilebilmektedir.

Geriye kalan tek nokta ise öldürülecek olan process' i refere eden WMI nesnesi üzerinden istenilen metodu, yani Terminate metodunu çağırmaktır. Görüldüğü üzere bu da InvokeMethod fonksiyonu sayesinde, ilgili metodun dinamik olarak çağırılması ile yapılabilir. InvokeMethod fonksiyonunun ikinci paramatresi olarak, dinamik olarak tanımlanan parametrelerinin, bir başka deyiş ile method üzerinden aldığımız param adlı nesnenin geçirildiğine dikkatinizi çekmek isterim.


Uygulama Yapısına Son Bir Bakış

Bu bölümde uygulamamızın yaptığı temel iki işlem olan, process' leri listelemek ve öldürmek için izlediği yolları basit birer flowchart ile göstereceğiz.


Şekil 2 – Kullanıcı Arabirimi


Şekil 3 – "Connect" butonu nasıl çalışıyor



Şekil 4 – "Kill" butonu nasıl çalışıyor

Örnek uygulama kodları için http://www.kozsu.com sitesini ziyaret edebilirsiniz. Uygulamanın kodları:

http://www.kozsu.com/admin/Portal/LinkClick.aspx?tabid=22&table=Documents&field=ItemID&id=39&link=ProcessManager.zip adresinden indirilebilir.

Yukarıdaki makale alıntıdır.


Çeşitli sitelerden bu konu ile alakalı örnek uygulama indirilebilir MSDN de de bir sürü yardım metini vardır.

Kolay gelsin
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 31 Aralık 2010, 14:42:04
Makale için çok teşekkür ederim fakat C ile olduğu için yine basic e dökememekteyim. Bir kod buldum. Akşam denemeler yapacağım. İnş bu sefer başarırım. Ayrıca aklıma takıldımadı değil.. ben bu cpu nosunu yaptığım basit bir programı korumak için öğrenmek istiyorum fakat! daha profesyönel yollarda vardır diye tahmin ediyorum.programları korumanın daha profesyönel yolları hakkında bilgisi olan varmı ?
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: Burak B - 31 Aralık 2010, 16:01:40
En basit şekilde şu iki link sana yardımcı olur.

http://allapi.mentalis.org/apilist/GetVolumeInformation.shtml (http://allapi.mentalis.org/apilist/GetVolumeInformation.shtml)

http://www.vbforfree.com/?p=263 (http://www.vbforfree.com/?p=263)

Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 01 Ocak 2011, 20:54:16
Hemen inceliyorum. Haaa bu arada visual net te form un start anında nerede başlıyacağını nerden ayarlıyoruz. Mesela VB6 da sağ en altta monitör resmi ve form resmi vardı. Ordan ayarını yapıyordukk ?
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: Digimensch - 01 Ocak 2011, 23:26:47
Alıntı yapılan: EMG81 - 01 Ocak 2011, 20:54:16
Hemen inceliyorum. Haaa bu arada visual net te form un start anında nerede başlıyacağını nerden ayarlıyoruz. Mesela VB6 da sağ en altta monitör resmi ve form resmi vardı. Ordan ayarını yapıyordukk ?
C#'da Formun ismini , cismini yani özelliklerini dagistirdigin kisim varya sag tarafda adi properies kismi.
orda StartPosition u bul ve karsiindaki cumbobox icindeki secenekleri degistirerek istedigin sekilde ayarlayabilirsin.
Örnegin Formun ekranin tam ortasinda acilmasini istersen CenterScreen secenegini secersin.

Kodlarla yapmak istiyorum dersen
Formun Load olayina
this.StartPosition = FormStartPosition.CenterScreen;

yazman yeterli olacaktir.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 03 Ocak 2011, 03:06:35
Değerli yanıtlarınız için çok teşekkür ederim..@Digimensch Dediğini programda uyguladım ve oldu... Hdd serial number içinde ilk sayfada verdiğim kodu programa ekledim. Yarın hocaya teslim edeceğim inş. Konuyu sonuçlanmış olarak işaretliyorum yalnız son bir sorum daha olacak. Vb net te bi label ın yada text in içerisinin hep 4 haneli olmasını istiyorum ve bunu nasıl yapabilirim ?

Örneğin;

label1.text="0001"

label1.text =label1.text + 1  desemde içerisinin "0002" olmasını istiyorum. veya + 1000 dersem, bu seferde label1.text="1002" gibi...
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: Digimensch - 03 Ocak 2011, 03:19:57
labelin icine zaten kullanici yazi yazamaz.
ama textbox dersen
textBox1.MaxLength = 4;  seklinde sinirlayabilirsin.

Yada önceki mesajimda belirttigim gibi textboxun properties kismindan MaxLength icerigine 4 yazarsan artik kullanici TectBox icine 4 basamakli sayidan fazla giremez....
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 03 Ocak 2011, 03:25:26
peki baştaki 0 ları nasıl halledebilirim ?
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 03 Ocak 2011, 15:46:59
stringval = right("0000" + trim(numericval) ,2)
label1.text = right("0000" + trim(val(label1.text)) ,2)
yada kullandığınız komponentin formatlama seçenekleri varsa o şekilde. label için yukarıdaki gibi.
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 03 Ocak 2011, 21:56:05
Verdiğiniz kod hata veriyor...

Hata veren kısımları ;

Stringval
numericval
Right
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 03 Ocak 2011, 22:37:28
ilk satır  sadece örnek olması içindi.
sadece bu yeterli.
label1.text = right("0000" + trim(val(label1.text)) ,2) 
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 04 Ocak 2011, 00:03:06
Right Komutu yine hata veriyor  :o


Denediğim ortam özellikleri ;

Bomboş bir form, Label1 , ve Button1

Label 1 in Text ine "54" yazdım Özellikler kısmından
button1 in içerisine verdiğiniz kodu kopyaladığımda right ı hatalı olarak görüyor...
Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: iyildirim - 04 Ocak 2011, 00:46:57
o kadar alışmışımki sanki right fonksiyonu varmış gibi. yada .NET'e alışamamışım.


Imports Microsoft.VisualBasic.Strings
Public Class Form1
Private Function Right(ByVal sTmp As String, ByVal lLen As Integer) As String
Right = sTmp.Substring(sTmp.Length - lLen, lLen)
End Function

       Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = Right("0000" + Trim(Val(Label1.Text) + 1), 4)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = "1"
End Sub
End Class

Başlık: Ynt: Visual Studio 2010 hdd veya cpu numaralarını öğrenmek ??
Gönderen: EMG81 - 04 Ocak 2011, 00:55:26
Evvet oldu! Import ve Right ı tanımlamadığımdan sorun çıkıyormuş... Bana değerli yanıtlarınızla yardımcı olduğunuz için hepinize tek tek teşekkür ederim...  :) bir daha ki konuda görüşmek üzere... ;)