Как удалить контрольные точки windows?

107
26 марта 2021, 04:40

За основу взят этот код, я его немного переделал.

Создал метод который возвращает все контрольные точки восстановления

public static string GetPoint()
{
  var Results = new StringBuilder();
  try
  {
    using (ManagementObjectCollection searcher = new ManagementObjectSearcher("root\\DEFAULT", "SELECT * FROM SystemRestore").Get())
    {
       foreach (ManagementBaseObject collection in searcher)
       {
          string description = collection["description"].ToString(); // Имя контрольной точки
          string sequencenumber = ((uint)collection["sequencenumber"]).ToString(); // Номер контрольной точки
           Results.AppendLine(sequencenumber);
       }
    }
  }
  catch (Exception ex) { Console.WriteLine(ex.Message); }
  return Results.ToString();
}

На выходе получаю порядковые номера контрольных точек Windows: 62, 73,

Но вот как мне удалить их через массив не понимаю, попробовал прогнать через foreach

foreach (var test in GetPoint()) // var возвращает char
{
   SRRemoveRestorePoint(test); // показывает только 2 
}

но это не помогло. Что исправить нужно?

[UPD]

Если просто записать SRRemoveRestorePoint(62); то точка восстановления удаляется нормально.

Answer 1

Решил вопрос следующим способом: Взял из этого примера

Удаляет все контрольные точки, проверил.

P.S: Для запуска требуются права Администратора.

public static void GetPoint()
{
  string[] sequencenums = new string[100];
  int c = 0;
  try
  {
    using (ManagementObjectCollection searcher = new ManagementObjectSearcher("root\\DEFAULT", "SELECT * FROM SystemRestore").Get())
    {
      foreach (ManagementBaseObject collection in searcher)
      {
        string description = collection["description"].ToString(); // Имя контрольной точки
        string sequencenumber = ((uint)collection["sequencenumber"]).ToString(); // Номер контрольной точки
        sequencenums[c] = sequencenumber; c++;
      }
    }
  }
  catch (Exception ex) { Console.WriteLine(ex.Message); }
  while (c >= 0)
  {
     int test = SRRemoveRestorePoint(Convert.ToInt32(sequencenums[c]));
     Console.WriteLine($"Point {test} deleted successfully!");
     c--;
  }
}

Если у Вас есть предложения по улучшению, давайте)

[UPD]

SRRemoveRestorePoint

Так же нашёл решение ещё одно, решил просто создать цикл for и прогнать в нём. Самое интересное что такой способ даже не вызывает никаких исключений и можно использовать спокойно в отдельном потоке.

// Запуск от Администратора.
public static void DeletePoint()
{
  for (int i = 0; i < 100; i++)
  {
     SRRemoveRestorePoint(i);
  }
}
READ ALSO
Как правильно вычислить дату в sql запросе?

Как правильно вычислить дату в sql запросе?

Есть задача, сделать выборку в таблице по возрасту - до ЛЕТДата рождения хранится в типе поля date

94
Вопрос про внешние ключи MySQL

Вопрос про внешние ключи MySQL

Как сделать автоматическую смену внешнего ключа в таблице при удалении родительской записи в другой таблице?

105