Скрипт PowerShell для удаления реестра ключей TDL - PullRequest
0 голосов
/ 05 мая 2019

Я работаю в сценарии для удаления ключа TDL из реестра Windows 10. Это они в:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileNotification
  • HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\ProfileNotification

Версия Windows для всех компьютеров - Windows 10 Pro 1809. Компьютеры находятся в домене Windows Server, 35 компьютеров.

    CLS
    # AMBAS RUTAS AL REGISTRO, elimino el comentario segun requiero
        $keyLocation = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileNotification\'
        # $keyLocation = 'SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\ProfileNotification\'

    $definition = @"
    using System;
    using System.Runtime.InteropServices; 

    namespace Win32Api
    {

        public class NtDll
        {
            [DllImport("ntdll.dll", EntryPoint="RtlAdjustPrivilege")]
            public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);
        }
    }
    "@ 

    # Defino variables
        $computerName = $env:computername | Select-Object
        $UserName = 'administrador'
        $computerUser = $computerName + '\' + $UserName
        $keyInitPath = 'HKLM'
        $keyName = 'TDL'
        $keyPath = $keyInitPath + ':\' + $keyLocation
        $keyPathComplete = $keyPath + $keyName
        $keyNameLocation = $keyLocation + $keyName


    Add-Type -TypeDefinition $definition -PassThru
    $bEnabled = $false

    # Tomo posesión de la clave TDL
        $res = [Win32Api.NtDll]::RtlAdjustPrivilege(9, $true, $false, [ref]$bEnabled)
        $key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($keyLocation + $keyName, [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::takeownership)
        $acl = $key.GetAccessControl()
        $acl.SetOwner([System.Security.Principal.NTAccount]$computerUser)


    # SET Permisos a TDL para administradores
        $key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($keyNameLocation,[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions)
        $acl = $key.GetAccessControl()
        $rule = New-Object System.Security.AccessControl.RegistryAccessRule (".\administradores","FullControl",@("ObjectInherit","ContainerInherit"),"None","Allow")
        $acl.SetAccessRule($rule)
        $key.SetAccessControl($acl)


    # Elimino la clave TDL
        Remove-Item -Path $keyPathComplete

Проблема в том, что они показывают мне ACCESS.DENIED, когда я запускаю его на другом компьютере в той же среде. В компьютере разработчика ошибки не обнаружены, все выполняются как одно заклинание, но в другом это показывает ошибку ACCESS DENIED, но не в сегменте TAKE OWNER, а в сегменте REMOVE.

Я проверяю ключ реестра Key throug, и никаких изменений не происходит, а также ошибок в PowerShell. Я не понимаю этого.

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

ПРИМЕЧАНИЕ: я выполняю как повышенные привилегии. (извините за мой английский)

1 Ответ

0 голосов
/ 05 мая 2019

inheritanceFlags, также как и параметр propagationFlags, представляет собой Flags Enum , означающее, что различные опции должны быть добавлены (или «ИЛИ-ed») вместе, чтобы сформировать битовую комбинацию.

В вашем коде вы устанавливаете их как массив @("ObjectInherit","ContainerInherit"), и, следовательно, разрешения не устанавливаются так, как вы ожидаете.
Затем, когда вы пытаетесь удалить ключ, вы получаете Access Denied, потому что разрешения для свойств внутри ключа не наследуются от ключа.

На самом деле вам нужно single значение, содержащее

[System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit

В PowerShell вы можете просто использовать для этого строку с разделителями-запятыми:

"ContainerInherit, ObjectInherit"

Попробуйте

$rule = New-Object System.Security.AccessControl.RegistryAccessRule(".\administradores","FullControl","ContainerInherit, ObjectInherit","None","Allow")

Надеюсь, это поможет

Обратите внимание, что можно также поразрядно OR числовые значения вместе, как в [System.Security.AccessControl.InheritanceFlags]::ObjectInherit.value__ -bor [System.Security.AccessControl.InheritanceFlags]::ContainerInherit.value__ что составит 3. Однако это не рекомендуется, поскольку делает код менее читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...