Ö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 ?
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.
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.
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.
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 ...
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.
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...
İ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.
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
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();
}
}
}
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...
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;
}
Ç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
hata verdi yada ben yapamadım...
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.
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 ?
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.
API değil de WMI diye bişi var bunun içinde isteğnizden fazlası olacaktı..
Visual Studio da çok yeniyim... O nedenle WMI yı biraz açabilirmisiniz ?
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
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ı ?
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)
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 ?
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.
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...
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....
peki baştaki 0 ları nasıl halledebilirim ?
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.
Verdiğiniz kod hata veriyor...
Hata veren kısımları ;
Stringval
numericval
Right
ilk satır sadece örnek olması içindi.
sadece bu yeterli.
label1.text = right("0000" + trim(val(label1.text)) ,2)
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...
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
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... ;)