Windows Kullanıcı Hesaplarını

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
aycen
Üye
Mesajlar: 20
Kayıt: 17 Mar 2008 03:08

Windows Kullanıcı Hesaplarını

Mesaj gönderen aycen »

s.a.

Windows Kullanıcı Hesaplarını Delphiden kod ile almak istiyorum. nasıl yapabilirm yardımlarınızı bekliyorum.

şimdiden teşekküerler...
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen ikutluay »

aycen yazdı:s.a.

Windows Kullanıcı Hesaplarını Delphiden kod ile almak istiyorum. nasıl yapabilirm yardımlarınızı bekliyorum.

şimdiden teşekküerler...
o an login olanımı yoksa tüm hesaplarımı ?
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
aycen
Üye
Mesajlar: 20
Kayıt: 17 Mar 2008 03:08

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen aycen »

bilgisayarda açılan tüm kullanıcı hesaplarını almak istiyorum.
bir yedekleme programı yapıyorum. otomatik olarak tüm kullanıcıların belgeleri ve diğer bilgilerini kopyalamak istiyorum.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen ikutluay »

http://www.faqts.com/knowledge_base/vie ... 96/fid/175

burada bişiler var ama ingilizce. standart fonksiyonlarla olmaz api ile olur diyor. logon olan deseydin çok kolay dı işin. ama bu şekilde biraz kasacaksın gibi
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
aycen
Üye
Mesajlar: 20
Kayıt: 17 Mar 2008 03:08

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen aycen »

tşk.ederim. hemem incelemeye başlıyacam.
bu olay bu kadar zor mu ? Sanki kolay gibi gelmişdi bana ?
login olanı hemem bulduğumdan bu da ona benziyen bir koddur diye düşündüm.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen ikutluay »

aycen yazdı:tşk.ederim. hemem incelemeye başlıyacam.
bu olay bu kadar zor mu ? Sanki kolay gibi gelmişdi bana ?
login olanı hemem bulduğumdan bu da ona benziyen bir koddur diye düşündüm.
şöyle düşün bir kullanıcı diğer tüm hepsinin herşeyine bu kadar basit erişirse nerde kalır xp nin güvenliği değilmi. işin kullanıcı ile bitmiyor. birde kullanıcı dosyalarını özel yaparsa yetkie autoher vs olaylarına girince neler yapacaksın onu düşün....
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
aycen
Üye
Mesajlar: 20
Kayıt: 17 Mar 2008 03:08

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen aycen »

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-839522115-1123561945-2146948035-1003]

reg. böyle bir kayıt buldum ama emin değilim. Burda ki değer yani "S-1-5-21" her bilgisayarda aynı mı? ondan sonra gelen uzun parametre her kullanıcı için değişiklik gösteriyor. Burda path de veriyor. Sana zahmet olmasa bir kontrol edermisin

kolay gelsin
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen ikutluay »

aycen yazdı:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-839522115-1123561945-2146948035-1003]

reg. böyle bir kayıt buldum ama emin değilim. Burda ki değer yani "S-1-5-21" her bilgisayarda aynı mı? ondan sonra gelen uzun parametre her kullanıcı için değişiklik gösteriyor. Burda path de veriyor. Sana zahmet olmasa bir kontrol edermisin

kolay gelsin
bendede ayı aynı. yalnız user sid i farklı. yalnız kodlama yaparken kullanıcı yetkilendirmelerine filan dikkat et. admin kullanıcıların dosyalarını kendilerine özelhale getirmişse orda epey bir uğraşman gerekecek.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen SHURZAN »

Shurzanop 2.0 projemde bununla ilgili çalışma yapmıştım.
Hesapları hem listeliyor hem yönetebiliyorsun hesap adını değiştirme, parola değiştirme, Hesaba ait login resmini değiştirme, Hesabı otomatik başlatma, Hesabı kıstlı , Admin yada devredışı bırakma, parola değitiremez ve uzak erişim için parola gerektirmez seçenekleri ile tüm hesapları yönetebiliyorsun.

Fakat Ben C++ ile çalışıyorum ve kodlamam doğal olarak C++ eğer kodları kendin için delphi ye dönüştürüp kullanabilirsen buradan yayınlayayım.
Bu çalışmaya Çok emek vermiştim belki yararlanacaklar olabilir.
Resim
En son SHURZAN tarafından 02 Eyl 2011 04:03 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen ikutluay »

API lerler yaptınız sanırım. doğrusu kodu incelemek isterim. Genel olarak artık her şey işi componentlere dökerek yapılıyor. bu bakımdan bunu incelemek isterim.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
aycen
Üye
Mesajlar: 20
Kayıt: 17 Mar 2008 03:08

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen aycen »

SHURZAN eğer bu kodu gönderebilirsen incelemek isterim. Çok yerde aradım fakat bulamadım.
C den delphi çevirmek zormudur. Komutlar fazla farklı değil galiba
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen ikutluay »

aycen yazdı:SHURZAN eğer bu kodu gönderebilirsen incelemek isterim. Çok yerde aradım fakat bulamadım.
C den delphi çevirmek zormudur. Komutlar fazla farklı değil galiba
hem evet hem hayır. eger klasik bir vt programı ise işin nispeten kolaydır. helede kullanılan c++ builder ise. ama api filan kasılan başka bir uygulamada veri tipleri şubu epey bilgi sahibi olak durumundasın yada sabretmey bilmelisin
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen SHURZAN »

Evet Windows API leri ile hesapları ve hesaplar ait kullanıcı adını yönetiyorsun bunun için component olduğunu sanmıyorum.
Kafanız karışmaması için sizi yönlendereyim Çünkü delphiye dönüştürmeniz zor olacaktır.
önce bir yapı(structe) sizde sanırım type oluşturacaksın aşağıdaki gibi.

Kod: Tümünü seç

struct Kisibilgi
 {
  wchar_t *name;
  unsigned long flags;
  unsigned long prv;
  unsigned long oturumsaati;
  String oturumsayi;
  PSID user_sid;
  String durum;
 };
daha sonra formun Create fonksiyonunda o andaki kullanıcı adını "User Account Pictures" ve bilgisayarı adını gibi değerleri alacaksın aşağıdaki gibi

Kod: Tümünü seç

TCHAR kaynak[200]; //Sistemin kurulu olduğu dizindeki dökümanlar ve ayarlar klasörü
 ExpandEnvironmentStrings("%SystemDrive%\\Documents and Settings\\",
                                         kaynak,sizeof(kaynak));
 usersettings = kaynak;

//Bilgisayar adını al
 ExpandEnvironmentStrings("%COMPUTERNAME%", kaynak,sizeof(kaynak));
 bilgisayaradi = kaynak;   

//kullanıcıların login resimlerin olduğu dizin
 ImagePath = usersettings+"All Users\\Application Data\\Microsoft\\"
             "User Account Pictures\\";  

 wchar_t user_name[256];
 DWORD size = sizeof( user_name);
 GetUserNameW( user_name, &size); // ve oan oturum açmış kullanıcı adı
 UserName = user_name;
Daha sonra kendi fonksiyonunu benim yazdığım gibi yazacaksın

Kod: Tümünü seç

void TKullanicilar::Hesaplar()
{
 Kisibilgi kisi;
 HesapListesi->Clear(); //Listview i temizle
 PNET_DISPLAY_USER pBuff, p;
 DWORD res, dwRec, i = 0;
 String NaMe, zaman;
 tm *ft;
 MultiByteToWideChar(CP_ACP, 0, "", -1, StringToOleStr(bilgisayaradi), 255);
 do  //Döngüye başla
   {
    res = NetQueryDisplayInformation(StringToOleStr(bilgisayaradi),
           1, i, 100, 0xFFFFFFFF, &dwRec, (PVOID *)&pBuff);
    if((res==ERROR_SUCCESS) || (res==ERROR_MORE_DATA))
      {
         p = pBuff;
         for(;dwRec>0;dwRec--)
         {
          kisi.name = p->usri1_name;
          userinfo(kisi);              //Her döngüde bulunan kullanıcı hakkında bilgi al

          NaMe =(StrLenW(p->usri1_full_name))?p->usri1_full_name:
          p->usri1_name;  
          if(kisi.oturumsaati != 0)
          {
          ft = localtime((long*)&kisi.oturumsaati);
          zaman  = IntToStr(ft->tm_wday)+'.'+
                   IntToStr(ft->tm_mon)+'.' +
                   IntToStr(ft->tm_year+1900);
          }
          else
         {
            zaman = "00.00.00";
          }
        
          itemlist = HesapListesi->Items->Add();   //Listview'e yeni kayıt ekle
          itemlist->Caption = NaMe;                      //Hesabın görünen kullanıcı adı
          itemlist->SubItems->Add(zaman);            //Son oturum açtığı zaman
          itemlist->SubItems->Add(kisi.oturumsayi+"  kez oturum açtı");       //Kaç kez oturum açtı?
          itemlist->SubItems->Add(p->usri1_comment);                              //Hesap hakkında kısa açıklama
          Hesapdurumu(itemlist,NaMe, p->usri1_flags);                             //Kullanıcı durumunu öğren
          itemlist->SubItems->Add(kisi.durum);                //Kullanıcın durmu "user, admin"  vs.
          itemlist->SubItems->Add(p->usri1_name); 
/*Bu hesap adı kullanıcın klsör adı bu adla belirlenir bu ad değiştirilebilmesine rağmen değiştirilmemesi gerekir bağlantı hatası oluşturur burada bu adı listview'e sütün eklemeden (listede görünmeyecek) alıyoruz çünkü seçilen bu ada göre görünen kullanıcı adı vs. işlemleri yapacağız*/

          i = p->usri1_next_index;
          p++;
      }
     Reg->CloseKey(); //Hesap durumunu öğrendikten sonra  Registry de ki bilgileri de alındıktan sonra restry kapat
     // Free the allocated memory.
     NetApiBufferFree(pBuff); // Buffer i free et
    }
   } while (res==ERROR_MORE_DATA); // end do
}
//---------------------------------------------------------------------------
Daha sonra listedeki kullanıcı hakkında bilgileri döndüren fonksiyonu aşağıdaki gibi yaz

Kod: Tümünü seç

void userinfo(Kisibilgi &kisi) //parametre referansla alınıyor !!!
 {
    String durum;
   //Hesap türünü öğren
    DWORD rc;
    USER_INFO_3 *info;
    
    rc = NetUserGetInfo( NULL, kisi.name, 3, (LPBYTE *)&info );
    if ( rc != NERR_Success )
        durum = "Okunamadı";

    kisi.prv   = info->usri3_priv;
    kisi.flags = info->usri3_flags;
    kisi.oturumsayi = info->usri3_num_logons/2;
    info->usri3_num_logons;
    kisi.oturumsaati = info->usri3_last_logon;
   
    switch(info->usri3_priv){

     case USER_PRIV_GUEST:
          durum = "Konuk";  break;
     case USER_PRIV_USER:
          durum = "Sınırlı";break;
     case USER_PRIV_ADMIN:
          durum = "Yönetici";break;
    }

    NetApiBufferFree( info );
    kisi.durum = durum;
 }
//-----------------------------------------------------------------------------
Ayrıca başlatma şeklini öğrenmen için benim aşağıda yazdığım gibi fonkasiyon yazmalısın

Kod: Tümünü seç

void TKullanicilar::Hesapdurumu(TListItem *item, String NaMe, unsigned long flags)
{
 String durum;
 
 //Hesap kapalı mı
 if(flags & UF_ACCOUNTDISABLE)
    {
     durum ="Devre dışı";
     itemlist->ImageIndex = 8;
    }
 else
{
 itemlist->ImageIndex = 7;
 //Hesap Açıksa
 Reg->RootKey = HKEY_LOCAL_MACHINE;
 //Hoşgeldiniz Ekranında hesap görünür mü?
if(Reg->OpenKey("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\"
                 "Winlogon\\SpecialAccounts\\UserList",false));
   if(Reg->ValueExists(NaMe) == true)
     {
       if(Reg->ReadInteger(NaMe) == 0)
          durum = "Gizli";
       else
          durum = "Görünür";
     }
   else
      durum = "Görünür";

//Hesap otomatik başlayan mı?
if(Reg->OpenKey("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",false))
  if((Reg->ReadString("DefaultUserName") == NaMe) &&
       (Reg->ReadString("AutoAdminLogon") == '1'))
        durum = "Otomatik";
Reg->CloseKey();   
 } //else sonu

 item->SubItems->Add(durum);
}
//------------------------------------------------------------------------
Buraya kadar kullanıcı hesaplarıyla ilgili işlemlerdi bundan sonrasi hesabın özniteliklerini değiştirmek için yönlendireceğim
bir fonksiyon daha yazacaksın
bu fonksiyonda aşağıdaki api leri kullanacaksın
tabi önce seçilen hesap hakkında bilgileri al

Kod: Tümünü seç

USER_INFO_2 *prv;
   DWORD flags, nStatus = 0;

   //Hesap hakkında bilgi al
  //currentName = HesapListesi->Selected->SubItems->Strings[5]; hesap adı kullanıcı adı değil
NetUserGetInfo(NULL, StringToOleStr(currentName), 2, (LPBYTE *)&prv );
   flags = prv->usri2_flags;
daha sonra parola değişliği yapacaksan

Kod: Tümünü seç

 //Parola değişikliği isteği
   if(Chparola->Checked)
   {
      USER_INFO_1003 password;
    if(EditParola->Text != "")
       password.usri1003_password = StringToOleStr(EditParola->Text.Trim());
    else//Parolayı iptal et
      password.usri1003_password = L"";

    NetUserSetInfo(NULL, prv->usri2_name, 1003,(LPBYTE)&password,NULL);
    if(nStatus != NERR_Success)
      Hatanedir(nStatus, "Parola işlemi sistem tarafından reddedildi");
    }
Hesabın kullanıcı adını değiştireceksen

Kod: Tümünü seç

if(ChAdi->Checked)
     {
      USER_INFO_1011 tamadi;
     if(EditAdi->Text.Trim() != "" )
      tamadi.usri1011_full_name = StringToOleStr(EditAdi->Text.Trim());
     else
      tamadi.usri1011_full_name = prv->usri2_full_name;

      //ad değişikliği isteğini uygla
      nStatus = NetUserSetInfo(NULL, prv->usri2_name, 1011, (LPBYTE)&tamadi, NULL);
      if(nStatus  != NERR_Success)
      Hatanedir(nStatus, "Kullanıcı adı sistem tarafından reddedildi");
      else
      LHesap->Caption = EditAdi->Text.Trim();
    }
Bu apilerden ve o apilere göre lazım olan yapı (type) nesnelerinin değlerini ayarlayarak apileri kullanabilirsin
Unutulmamalı hesap adı başka kullanıcı adı başkadır Örneğin benim hesap adım shurzan kullanıcı adım yaşar dır
"Documents and Settings" e bakıldığında yaşar adında değil shurzan adında dökümanlar ve ayarlar klsörü vardır denetim masasında kullanıcı hesaplarına bakıldığında ve login ekranında shurzan görülmez yaşar görülür ama yaşarla her işlemi shurzan account ile yapılmaktadır.
Umarın kafanızı karıştırmadan yardımcı olmuşumdur.
Başarılar...
aycen
Üye
Mesajlar: 20
Kayıt: 17 Mar 2008 03:08

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen aycen »

çok faydalı bir açıklama yapmışın. eline sağlık.
hemem bu kodları uygalamaya çalışacam

teşekkür ederim..
Kullanıcı avatarı
SHURZAN
Üye
Mesajlar: 73
Kayıt: 06 Eki 2007 05:34
Konum: İstanbul

Re: Windows Kullanıcı Hesaplarını

Mesaj gönderen SHURZAN »

Rica ederim faydalı olduysam ne mutlu bana.
Yeni kullanıcı hesabı oluşturmak için "NetUserAdd" API den yararlanabilirsin fakat yeni kullanıcnın hangi kullanıcı grubunda olacağını belirlemen lazım bunuda "NetLocalGroupAddMembers" API si ile yapmalısın ayrıca kullanıcıya ait Flags ları ayarlamalısın.Yeni kullanıcı eklemek için aşağıdaki gibi bir fonksiyon yazabilirsin.
Resim

Kod: Tümünü seç

void __fastcall TYenihesap::BitBtn1Click(TObject *Sender)
{
 if(EditAdi->Text != "")
 {
    if(EditAdi->Text.Trim().UpperCase() == bilgisayaradi.UpperCase())
    {
     Application->MessageBox("Kullanıcı adı bilgisayar adıyla aynı olamaz!\n\n"
                "Başka bir kullanıcı adı seçin","Hata",0+48);
     return;
    }
        String grup;
        USER_INFO_1      ui;
        LOCALGROUP_MEMBERS_INFO_3   localgroup_members;
        NET_API_STATUS   nStatus;

        ui.usri1_flags = UF_SCRIPT;

         if(Hak1->Checked)
           {
            grup = "Guests";
            ui.usri1_flags |= UF_PASSWD_NOTREQD;
           }
         else
           if(Hak2->Checked)
             {
              grup = "Users";
              ui.usri1_flags |= UF_DONT_EXPIRE_PASSWD;
             }
           else{
                grup = "Administrators";
                ui.usri1_flags |= UF_DONT_EXPIRE_PASSWD;
               }


        if(Choz1->Checked)
          ui.usri1_flags |= UF_PASSWD_NOTREQD;

        if(Choz2->Checked)
        ui.usri1_flags |= UF_PASSWD_CANT_CHANGE;

        ui.usri1_name           =   StringToOleStr(EditAdi->Text.Trim());
        ui.usri1_password       =   StringToOleStr(Editparola->Text.Trim());
        ui.usri1_priv           =   USER_PRIV_USER;
        ui.usri1_password_age   =   NULL;
        ui.usri1_home_dir       =   NULL;
        ui.usri1_comment        =   NULL;
        ui.usri1_script_path    =   NULL;

        nStatus = NetUserAdd (NULL, 1,(LPBYTE) &ui,  NULL);

        if   (nStatus == NERR_Success)
        {
         localgroup_members.lgrmi3_domainandname = StringToOleStr(EditAdi->Text.Trim());
         nStatus = NetLocalGroupAddMembers( NULL,StringToOleStr(grup), 3, (LPBYTE)&localgroup_members, 1   );
         Kullanicilar->userokey = true;
          if   (nStatus != NERR_Success)
          {
            Hatanedir(nStatus, "Yeni kullanıcı için hesap türü tayini"
                                "sistem tarafından reddedildi" );
            return;
          }

        }
        else
        {
         if(nStatus == NERR_UserExists)
          Hatanedir(nStatus,"Yeni kullanıcı sistem tarafından reddedildi");
          return;
        }

 }
 else {
 Application->MessageBoxA("Kullanıcı Adı boş bırakılamaz.", "Hata",0+16);
 return;
 }
Close();
}
//---------------------------------------------------------------------------
Ayrıca...
Bir kullanıcı hesabını silmek için ise "NetUserDel" API sinden yararlanabilirsin. Bunlar için yeterince bilgi Builder yardım dosyasında mevcut Builderin yardım dosyasınıda incelemeni tavsiye ederim.
Tabi bunlar tamamen delphi ile yapacağını sanıyorum. Kodların tam uyumluluk için C++ dan anlayan bir dephi ciden yardım almalısın Bu forumda yardımcı olacak forumdaş arkadaşların olacağını sanıyorum. Ben Delphi kod örneklerini kendi projelerimde C++ kodlarına dönüştürerek kullanıyorum ama tersini yap desen yapamam.
Yukarıda vermiş olduğum kodlar çalışan test edilmiş kullanılmakta olan projemden verdim.
Bu konu belki makale konusu olabilirdi umarım yararlanırsınız.
Yaşar [SHURZAN]
En son SHURZAN tarafından 02 Eyl 2011 03:59 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Cevapla