none
RegistryTreeChangeEvent (convertir le VBS en C#)

    Question

  • Bonjour,

    Je cherche a faire fonctionner RegistryTreeChangeEvent en C#, j'ai fait pas mal de recherche sur le net mais sans trouvé solution a mon problème.

    J'ai trouvé quand meme un script VBS qui fonctionne bien, mais je suis incapable de faire une convertion vers le C#

    wbemFlagReturnImmediately = 16
    wbemFlagForwardOnly = 32
    IFlags = wbemFlagReturnImmediately + wbemFlagForwardOnly
    
    Set wmiServices = GetObject("winmgmts:root/default") 
    Set dtmCreateTime = CreateObject("WbemScripting.SWbemDateTime")
    
    Set colRegChanges = wmiServices.ExecNotificationQuery _
        ("SELECT * FROM RegistryTreeChangeEvent " _
        & "WHERE Hive='HKEY_LOCAL_MACHINE' AND RootPath='SYSTEM\\Applications'",, IFlags)
    
    Do While (True)
       Set TreeChange = colRegChanges.NextEvent
    
    'Time_Created property is 64-bit and
    ' must be converted into CIM_DateTime format
       dtmCreateTime.SetFileTime TreeChange.Time_Created, false
    
    'Convert to VT_DATE format using GetVarDate
    ' for printing to screen
       Wscript.Echo "Time = " & dtmCreateTime.GetVarDate() _
                  & VBNewLine _
                  & "Hive = " & TreeChange.Hive & VBNewLine _
                  & "RootPath = "& TreeChange.RootPath    
    Loop
    

    Si une personne connait bien le VBS et pourrais faire la conversion cela serait top ou aurait du code fonctionnel.

    En vous remerciant d'avance,

    Cordialement,

    XT


    Cordialement,

    jeudi 9 février 2017 16:40

Réponses

Toutes les réponses

  • Bonsoir,

    Pour accéder au registre vous pouvez utiliser les assembly suivant

    using System.Reflection;
    using Microsoft.Win32;

    Voici un petit exemple d'utilisation de la base de registre.

    private void Form1_Load(object sender, EventArgs e)
    {
      Assembly l_Ass = Assembly.GetEntryAssembly();
      RegistryKey l_RegSoftW = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
      RegistryKey l_RegAssN = Registry.CurrentUser.CreateSubKey(l_Ass.GetName().Name);

      object l_Obj = l_RegAssN.GetValue("DATEUTILISATION");
      object l_Objduree = l_RegAssN.GetValue("DUREEUTILISATION");
      if ((l_Obj != null) && (l_Objduree !=null) )
       {
         long l_Ticks = Convert.ToInt64(l_Obj);
         DateTime l_Date = new DateTime(l_Ticks);
         l_Ticks = Convert.ToInt64(l_Objduree);
         TimeSpan l_Duree = new TimeSpan(l_Ticks);
         MessageBox.Show(
         string.Format("Dernière utilisation le {0:d}, pendant {1:D}h {2:D}m {3:D}s",                     
         new object[] { l_Date, l_Duree.Hours, l_Duree.Minutes, l_Duree.Seconds}));
       }
     }
     private void Form1_FormClosing(object sender, FormClosingEventArgs e)
     {
       Assembly l_Ass = Assembly.GetEntryAssembly();
       RegistryKey l_RegSoftW = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
       RegistryKey l_RegAssN = Registry.CurrentUser.CreateSubKey(l_Ass.GetName().Name);
       DateTime l_DateFin = DateTime.UtcNow.ToLocalTime();
       l_RegAssN.SetValue("DATEUTILISATION", m_DateDebut.Ticks);
       TimeSpan l_Duree = m_DateDebut - l_DateFin;
       l_RegAssN.SetValue("DUREEUTILISATION", l_Duree.Ticks);
     }

    Cordialement

    Gérard

    jeudi 9 février 2017 18:57
  • Il y a divers exemples de RegistryTreeChangeEvent en C#

    Par exemple, RegistryWatchers.cs

    • Marqué comme réponse Troxsa vendredi 10 février 2017 09:21
    jeudi 9 février 2017 19:14
  • Super Merci Castorix,

    Voici le code pour d'autre personne qui souhaiterais faire la meme chose

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Management;
    using Microsoft.Win32;
    using System.Security.Principal;
    
    namespace RegistryTreeChangeEvent
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            ManagementEventWatcher bootWatch = new ManagementEventWatcher();
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string bootSql = @"SELECT * FROM RegistryTreeChangeEvent WHERE HIVE='HKEY_LOCAL_MACHINE' AND RootPath = 'SYSTEM\\...SUB...\\...SUBKEY...'";
                WqlEventQuery bootQuery = new WqlEventQuery(bootSql);
                bootWatch.Query = bootQuery;
                bootWatch.EventArrived += new EventArrivedEventHandler(localMachineEvent);
                bootWatch.Start();
            }
    
            private void localMachineEvent(object sender, EventArrivedEventArgs e)
            {
                Console.WriteLine("Event");
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                bootWatch.Stop();
            }
        }
    }
    
       
    
    
    

    Merci pour votre aide

    Cordialement,

    XT


    Cordialement,

    vendredi 10 février 2017 09:21