Удалите все подразделы в ключе реестра

Как подрядчик, который предоставляет услуги системного администратора небольшим компаниям, включая ASIC и аппаратные дизайнерские бюро, у меня есть эта перспектива:

Значение системного администратора не является, прежде всего, различием между его прямыми затратами и прямыми затратами инженеров, которые являются sysadmin'ing, а не engineer'ing.

По моему опыту, большинство (но не все) инженеры является хорошими инженерами, но паршивыми системными администраторами. Они знают, как сделать техническую сторону, но сети здания, серверы и сервисы не то, что они делают все время.

Системный администратор может увеличить свое значение, если он может улучшить производительность инженеров - для одной конкретной промышленности я работаю в, мы удвоились или больше единицы работы, сделанные посредством регрессии и фермы сервера моделирования путем изменения их сетевой инфраструктуры, увеличивания значения их фермы сервера, инженеров и очень дорогих лицензий инструментов. Это было намного большим значением к бизнесу, чем простое освобождение инженеров от обязанностей системного администратора.

Конечно, не каждая компания имеет низко висящий плод как этот!..

Значение также увеличено путем предотвращения времен простоя, которые препятствуют тому, чтобы большее число людей работало. Я всегда говорю, если Ваш ресурс IT никогда не должен быть локальным, то он делает довольно хорошее задание...

То, в чем Вы нуждаетесь, является оценкой от кого-то, кому Вы доверяете, не только кто-то ищущий задание или надеющийся продавать Вам что-то (хотя они будут делать это, также). Кто-то, кто войдет и посмотрит на Ваш сайт, по всей длине, и задаст Вам вопросы о том, что Вы делаете, как Вы делаете это, и что Вы пытаетесь выполнить - поскольку это все совсем другие вещи!

Нахождение этих людей может быть легким или трудным, завися :) Я предлагаю, чтобы Вы говорили со своей сетью коллег в других отраслях промышленности и спросили их, которых они использовали в прошлом хороший или плохой. Проведите свое исследование. Попросите, и проверка, ссылки.

То, что также необходимо сделать, распознают, что это будет стоить денег. Время для FT/P или консультанта (или команда консультантов). Я лично предпочитаю, чтобы клиенты привлекли мою компанию с маленьким постоянным числом локальных часов в неделю. У них затем есть доступ к моей целой команде и их варьировавшимся экспертным знаниям так, чтобы наши ответы могли увеличиться (или) при необходимости без них имеющий необходимость постоянно иметь многочисленный штат FT/P по платежной ведомости. В какой-то момент имеет смысл идти с собственным FT/P, если только как старший IT или менеджер по ИТ. Но Вы не должны идти туда сразу же, если Вы получаете правильную команду.

Также поймите, что любое новое тело захочет изменить способ, которым сделаны некоторые вещи, и начальные изменения могут быть ухабистыми. Поэтому необходимо доверять, кого Вы получаете для взятия Вас от того, где Вы к некоторому компромиссу между тем, где Вы хотите быть и что Вы готовы предоставить.

Если Вы задаете вопрос, то настало время, чтобы начать провести исследование и возможно иметь одного или двух консультантов в сделать оценку. Затем возьмите то, что они говорят и решают, каков следующий шаг.

5
задан 1 September 2009 в 01:42
8 ответов

Вы знаете то, что подразделы заранее? Раз так можно сделать это с .reg файлом с помощью чего-то вроде этого для удаления всех подразделов Теста:

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\Software\Test\Key1]
[-HKEY_LOCAL_MACHINE\Software\Test\Key2]
[-HKEY_LOCAL_MACHINE\Software\Test\Key3]
[-HKEY_LOCAL_MACHINE\Software\Test\Key4]

Знак "минус" в начале строки говорит этому удалять тот ключ, полный синтаксис здесь: http://support.microsoft.com/kb/310516

В противном случае затем Вы ищете сценарий, это перечислит все подразделы и затем пройдет удаление их всех один за другим. У меня есть тот, который это сделает это на работе, но я дома и не могу добраться до него!

1
ответ дан 3 December 2019 в 01:08
  • 1
    Вопросом является на самом деле спорный вопрос теперь, я don' t должен больше делать это. И не, я не знаю подразделы заранее. Спасибо так или иначе! –  Cameron 1 September 2009 в 02:00

С Windows7 или Vista, можно использовать команды Powershell как это, обращение к реестру соединяет каналом тот же способ, которым Вы обращаетесь к пути файловой системы:

Remove-Item -Path HKLM:\Software\Test\Key1 -Recurse
Remove-Item -Path HKLM:\Software\Test\Key2 -Recurse
Remove-Item -Path HKLM:\Software\Test\Key3 -Recurse
Remove-Item -Path HKLM:\Software\Test\Key4 -Recurse
7
ответ дан 3 December 2019 в 01:08

Aquí teniu la forma de PowerShell per eliminar tota la subclau d'una clau de registre:

$path = "Any valid Path ..."
(gci $path).PsPath  | foreach { if($_){Remove-Item $_ -Force} }

Per exemple:

$path = "HKLM:\Software\Policies\Microsoft\Windows\RemovableStorageDevices"
(gci $path).PsPath  | foreach { if($_){Remove-Item $_ -Force} }
1
ответ дан 3 December 2019 в 01:08
reg delete RegistryKey  /va

. Пример

reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /va

удаляет все ключи в Run \

-1
ответ дан 3 December 2019 в 01:08

Оригинальный плакат разъясняет вопрос, указывая, что они хотят дерево удалено, но не фактический корневой ключ дерева. Таким образом, это не совсем ответ, потому что он удалит все дерево, включая корень. Тем не менее, поскольку при поиске ответа на заголовок вопроса он отображается высоко в результатах поиска, я счел полезным опубликовать этот ответ.

<#
.SYNOPSIS 
 Give ownership of a file, folder, or registry key to the specified user.

.DESCRIPTION
 Give the current process the SeTakeOwnershipPrivilege" and "SeRestorePrivilege" rights which allows it
 to reset ownership of an object.  The script will then set the owner to be the specified user.

.PARAMETER Path (Required)
 The path to the object on which you wish to change ownership.  It can be a file, folder, or registry key

.PARAMETER User (Required)
 The user whom you want to be the owner of the specified object.  The user should be in the format
 <domain>\<username>.  Other user formats will not work.  For system accounts, such as System, the user
 should be specified as "NT AUTHORITY\System".  If the domain is missing, the local machine will be assumed.

.PARAMETER Recurse (switch)
 Causes the function to parse through the Path recursively.

.INPUTS
 None. You cannot pipe objects to Take-Ownership

.OUTPUTS
 None

.NOTES
 Name:    Take-Ownership.ps1
 Author:  Jason Eberhardt
 Date:    2017-07-20
#>
function Take-Ownership {
  [CmdletBinding(SupportsShouldProcess=$false)]
  Param([Parameter(Mandatory=$true, ValueFromPipeline=$false)] [ValidateNotNullOrEmpty()] [string]$Path,
        [Parameter(Mandatory=$true, ValueFromPipeline=$false)] [ValidateNotNullOrEmpty()] [string]$User,
        [Parameter(Mandatory=$false, ValueFromPipeline=$false)] [switch]$Recurse)

  Begin {
    $AdjustTokenPrivileges=@"
using System;
using System.Runtime.InteropServices;

  public class TokenManipulator {
    [DllImport("kernel32.dll", ExactSpelling = true)]
      internal static extern IntPtr GetCurrentProcess();

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
      internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
      internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
    [DllImport("advapi32.dll", SetLastError = true)]
      internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct TokPriv1Luid {
      public int Count;
      public long Luid;
      public int Attr;
    }

    internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
    internal const int TOKEN_QUERY = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

    public static bool AddPrivilege(string privilege) {
      bool retVal;
      TokPriv1Luid tp;
      IntPtr hproc = GetCurrentProcess();
      IntPtr htok = IntPtr.Zero;
      retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
      tp.Count = 1;
      tp.Luid = 0;
      tp.Attr = SE_PRIVILEGE_ENABLED;
      retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
      retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
      return retVal;
    }

    public static bool RemovePrivilege(string privilege) {
      bool retVal;
      TokPriv1Luid tp;
      IntPtr hproc = GetCurrentProcess();
      IntPtr htok = IntPtr.Zero;
      retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
      tp.Count = 1;
      tp.Luid = 0;
      tp.Attr = SE_PRIVILEGE_DISABLED;
      retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
      retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
      return retVal;
    }
  }
"@
  }

  Process {
    $Item=Get-Item $Path
    Write-Verbose "Giving current process token ownership rights"
    Add-Type $AdjustTokenPrivileges -PassThru > $null
    [void][TokenManipulator]::AddPrivilege("SeTakeOwnershipPrivilege") 
    [void][TokenManipulator]::AddPrivilege("SeRestorePrivilege") 

    # Change ownership
    $Account=$User.Split("\")
    if ($Account.Count -eq 1) { $Account+=$Account[0]; $Account[0]=$env:COMPUTERNAME }
    $Owner=New-Object System.Security.Principal.NTAccount($Account[0],$Account[1])
    Write-Verbose "Change ownership to '$($Account[0])\$($Account[1])'"

    $Provider=$Item.PSProvider.Name
    if ($Item.PSIsContainer) {
      switch ($Provider) {
        "FileSystem" { $ACL=[System.Security.AccessControl.DirectorySecurity]::new() }
        "Registry"   { $ACL=[System.Security.AccessControl.RegistrySecurity]::new()
                       # Get-Item doesn't open the registry in a way that we can write to it.
                       switch ($Item.Name.Split("\")[0]) {
                         "HKEY_CLASSES_ROOT"   { $rootKey=[Microsoft.Win32.Registry]::ClassesRoot; break }
                         "HKEY_LOCAL_MACHINE"  { $rootKey=[Microsoft.Win32.Registry]::LocalMachine; break }
                         "HKEY_CURRENT_USER"   { $rootKey=[Microsoft.Win32.Registry]::CurrentUser; break }
                         "HKEY_USERS"          { $rootKey=[Microsoft.Win32.Registry]::Users; break }
                         "HKEY_CURRENT_CONFIG" { $rootKey=[Microsoft.Win32.Registry]::CurrentConfig; break }
                       }
                       $Key=$Item.Name.Replace(($Item.Name.Split("\")[0]+"\"),"")
                       $Item=$rootKey.OpenSubKey($Key,[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::TakeOwnership) }
        default { throw "Unknown provider:  $($Item.PSProvider.Name)" }
      }
      $ACL.SetOwner($Owner)
      Write-Verbose "Setting owner on $Path"
      $Item.SetAccessControl($ACL)
      if ($Provider -eq "Registry") { $Item.Close() }

      if ($Recurse.IsPresent) {
        # You can't set ownership on Registry Values
        if ($Provider -eq "Registry") { $Items=Get-ChildItem -Path $Path -Recurse -Force | Where-Object { $_.PSIsContainer } }
        else { $Items=Get-ChildItem -Path $Path -Recurse -Force }
        $Items=@($Items)
        for ($i=0; $i -lt $Items.Count; $i++) {
          switch ($Provider) {
            "FileSystem" { $Item=Get-Item $Items[$i].FullName
                           if ($Item.PSIsContainer) { $ACL=[System.Security.AccessControl.DirectorySecurity]::new() }
                           else { $ACL=[System.Security.AccessControl.FileSecurity]::new() } }
            "Registry"   { $Item=Get-Item $Items[$i].PSPath
                           $ACL=[System.Security.AccessControl.RegistrySecurity]::new()
                           # Get-Item doesn't open the registry in a way that we can write to it.
                           switch ($Item.Name.Split("\")[0]) {
                             "HKEY_CLASSES_ROOT"   { $rootKey=[Microsoft.Win32.Registry]::ClassesRoot; break }
                             "HKEY_LOCAL_MACHINE"  { $rootKey=[Microsoft.Win32.Registry]::LocalMachine; break }
                             "HKEY_CURRENT_USER"   { $rootKey=[Microsoft.Win32.Registry]::CurrentUser; break }
                             "HKEY_USERS"          { $rootKey=[Microsoft.Win32.Registry]::Users; break }
                             "HKEY_CURRENT_CONFIG" { $rootKey=[Microsoft.Win32.Registry]::CurrentConfig; break }
                           }
                           $Key=$Item.Name.Replace(($Item.Name.Split("\")[0]+"\"),"")
                           $Item=$rootKey.OpenSubKey($Key,[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::TakeOwnership) }
            default { throw "Unknown provider:  $($Item.PSProvider.Name)" }
          }
          $ACL.SetOwner($Owner)
          Write-Verbose "Setting owner on $($Item.Name)"
          $Item.SetAccessControl($ACL)
          if ($Provider -eq "Registry") { $Item.Close() }
        }
      } # Recursion
    }
    else {
      if ($Recurse.IsPresent) { Write-Warning "Object specified is neither a folder nor a registry key.  Recursion is not possible." }
      switch ($Provider) {
        "FileSystem" { $ACL=[System.Security.AccessControl.FileSecurity]::new() }
        "Registry"   { throw "You cannot set ownership on a registry value"  }
        default { throw "Unknown provider:  $($Item.PSProvider.Name)" }
      }
      $ACL.SetOwner($Owner)
      Write-Verbose "Setting owner on $Path"
      $Item.SetAccessControl($ACL)
    }
  }
}

<#
.SYNOPSIS 
 Deletes a registry key recursively

.DESCRIPTION
 This function will delete the specified registry key and all its values and subkeys

.INPUTS
 None. You cannot pipe objects to Delete-RegistryKeyTree.

.EXAMPLE
 Delete-RegistryKeyTree -Hive HKCR -Key "CLSID\squid" -User $env:USERNAME

.OUTPUTS
 System.String

.NOTES
 Name:    Delete-RegistryKeyTree
 Author:  Jason Eberhardt
 Date:    2017-07-20
#>
function Delete-RegistryKeyTree {
  [CmdletBinding(SupportsShouldProcess=$false)]
  Param([Parameter(Mandatory=$true, ValueFromPipeline=$false)] [ValidateSet("HKCR","HKLM","HKCU","HKU","HKCC")] [string]$Hive,
        [Parameter(Mandatory=$true, ValueFromPipeline=$false)] [ValidateNotNullOrEmpty()] [string]$Key,
        [Parameter(Mandatory=$true, ValueFromPipeline=$false)] [ValidateNotNullOrEmpty()] [string]$User)

  Process {
    switch ($Hive) {
      "HKCR" { $rootKey=[Microsoft.Win32.RegistryHive]::ClassesRoot; break }
      "HKLM" { $rootKey=[Microsoft.Win32.RegistryHive]::LocalMachine; break }
      "HKCU" { $rootKey=[Microsoft.Win32.RegistryHive]::CurrentUser; break }
      "HKU"  { $rootKey=[Microsoft.Win32.RegistryHive]::Users; break }
      "HKCC" { $rootKey=[Microsoft.Win32.RegistryHive]::CurrentConfig; break }
    }

    $Reg=[Microsoft.Win32.RegistryKey]::OpenBaseKey($rootKey,[Microsoft.Win32.RegistryView]::Default)
    $RegKey=$Reg.OpenSubKey($Key,[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::FullControl)
    if ($RegKey -eq $null) { Write-Warning "Registry key is already deleted." }
    else {
      Write-Verbose "Deleting key $Key"
      Take-Ownership -Path "Registry::$Hive\$Key" -User $User -Recurse
      Write-Verbose "Resetting permissions on $KeyName"
      $ACL=New-Object System.Security.AccessControl.RegistrySecurity
      $ACL.SetAccessRuleProtection($false,$false)
      $FSR=New-Object System.Security.AccessControl.RegistryAccessRule($User, [System.Security.AccessControl.RegistryRights]::FullControl, ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit), [System.Security.AccessControl.PropagationFlags]::None, [System.Security.AccessControl.AccessControlType]::Allow)
      $ACL.ResetAccessRule($FSR)
      $RegKey.Close()
      $RegKey=$Reg.OpenSubKey($KeyName,[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions)
      $RegKey.SetAccessControl($ACL)
      $RegKey.Close()
      $Reg.Close()
      Write-Verbose "Deleting $Key"
      $result=& cmd /c "reg delete $Hive\$Key /f" 
      Write-Verbose $result[0]
    }
  }
}
0
ответ дан 3 December 2019 в 01:08
New-Item $path -Force

A -Force érv elvégzi a munkát.

0
ответ дан 3 December 2019 в 01:08

Вы можете запустить эту команду:

for /f "tokens=*" %A in ('reg query HKLM\Software\policies\microsoft\') do reg delete %A /f

for /f "tokens=*" %A in ('reg query HKLM\Software\microsoft\windows\CurrentVersion\policies\') do reg delete %A /f

Если она будет использоваться как пакет, не забудьте заменить% A на %% A. В этом примере удаляется политика компьютера.

0
ответ дан 3 December 2019 в 01:08

Выдержки из Работа с ключами реестра :

Если вы хотите удалить все элементы в пределах HKCU:\CurrentVersion, но не HKCU:\CurrentVersion, вы можете вместо этого использовать:

#Requires -Version 3.0
Remove-Item -Path HKCU:\CurrentVersion\* -Recurse

Примечание: Значения реестра, принадлежащие HKCU:\CurrentVersion, не удаляются.

.
3
ответ дан 3 December 2019 в 01:08

Теги

Похожие вопросы