Archivo bat para borrar una entrada de registro

Páginas: << < (2/3) > >>

Eleкtro:

Cita de: zelarra en 17 Marzo 2024, 22:55 pm
--
Esto es lo que debería borrar en el registro:

https://www.dropbox.com/scl/fi/ozju0sdo40bcfam5f14ge/04.jpg
--

Y esa es precisamente la clave que encuentra y termina borrando, como expliqué en mi primer comentario.


Podría haber algún problema de permisos de usuario; el script que has mostrado igora los errores sin mostrar información en caso de error (bloque catch vacío).

Lo he modificado un poco (bastante) a conveniencia para informar sobre errores. Asegúrate de que las rutas del registro son correctas por que no se si las he escrito bien viendo las capturas de pantalla:



Script.ps1
Código
--
<# REGISTRY KEY DEFINITIONS #>
--
 
--
$RegKeys = @(
--
@{Path = "HKCR\*\shell\ShareWithSkype"
--
 IsLiteralPath = $true},
--
@{Path = "HKCR\PackagedCom\ClassIndex\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
--
 IsLiteralPath = $true},
--
@{Path = "HKCR\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
--
 IsLiteralPath = $false},
--
@{Path = "HKLM\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
--
 IsLiteralPath = $false}
--
)
--
 
--
<# REGISTRY KEYS DELETION #>
--
 
--
foreach ($regKey in $RegKeys) {
--
[String]$path = $regKey.Path
--
[Boolean]$testPath = if ($regKey.IsLiteralPath) { Test-Path -LiteralPath "Registry::$path" } else { Test-Path "Registry::$path" }
--
 
--
if ($testPath) {
--
try {
--
Remove-Item -Path "Registry::$path" -Recurse -ErrorAction Stop
--
Write-Host "Registry key deleted: $path"
--
} catch {
--
Write-Error $_.Exception.Message
--
}
--
} else {
--
Write-Warning "Registry key not found: $path"
--
}
--
}
--
 
--
<# END #>
--
 
--
Write-Host "`nOperation Completed.`n"-BackgroundColor Black -ForegroundColor Green
--
Write-Host "Press any key to exit..."
--
$Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown") | Out-Nu
--
Exit(0)
--


zelarra:

Esto es el resultado:

https://ibb.co/5jdzBsj

Muchas gracias.

Eleкtro:

El error se debe a que no tienes permisos de eliminación sobe la clave.

Prueba con esta nueva modificación:



Código
--
<# REGISTRY KEY DEFINITIONS #>
--
 
--
$RegKeys = @(
--
   @{Path = "HKCR\*\shell\ShareWithSkype"
--
     IsLiteralPath = $true},
--
   @{Path = "HKCR\PackagedCom\ClassIndex\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
--
     IsLiteralPath = $true},
--
   @{Path = "HKCR\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
--
     IsLiteralPath = $false},
--
   @{Path = "HKLM\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
--
     IsLiteralPath = $false}
--
)
--
 
--
<# https://stackoverflow.com/a/35843420/1248295 #>
--
 
--
function Take-Permissions {
--
   # Developed for PowerShell v4.0
--
   # Required Admin privileges
--
   # Links:
--
   #   http://shrekpoint.blogspot.ru/2012/08/taking-ownership-of-dcom-registry.html
--
   #   http://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/
--
   #   https://powertoe.wordpress.com/2010/08/28/controlling-registry-acl-permissions-with-powershell/
--
 
--
   param($rootKey, $key, [System.Security.Principal.SecurityIdentifier]$sid = 'S-1-5-32-545', $recurse = $true)
--
 
--
   switch -regex ($rootKey) {
--
       'HKCU|HKEY_CURRENT_USER'    { $rootKey = 'CurrentUser' }
--
       'HKLM|HKEY_LOCAL_MACHINE'   { $rootKey = 'LocalMachine' }
--
       'HKCR|HKEY_CLASSES_ROOT'    { $rootKey = 'ClassesRoot' }
--
       'HKCC|HKEY_CURRENT_CONFIG'  { $rootKey = 'CurrentConfig' }
--
       'HKU|HKEY_USERS'            { $rootKey = 'Users' }
--
   }
--
 
--
   ### Step 1 - escalate current process's privilege
--
   # get SeTakeOwnership, SeBackup and SeRestore privileges before executes next lines, script needs Admin privilege
--
   $import = '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(ulong a, bool b, bool c, ref bool d);'
--
   $ntdll = Add-Type -Member $import -Name NtDll -PassThru
--
   $privileges = @{ SeTakeOwnership = 9; SeBackup =  17; SeRestore = 18 }
--
   foreach ($i in $privileges.Values) {
--
       $null = $ntdll::RtlAdjustPrivilege($i, 1, 0, [ref]0)
--
   }
--
 
--
   function Take-KeyPermissions {
--
       param($rootKey, $key, $sid, $recurse, $recurseLevel = 0)
--
 
--
       ### Step 2 - get ownerships of key - it works only for current key
--
       $regKey = [Microsoft.Win32.Registry]::$rootKey.OpenSubKey($key, 'ReadWriteSubTree', 'TakeOwnership')
--
       $acl = New-Object System.Security.AccessControl.RegistrySecurity
--
       $acl.SetOwner($sid)
--
       $regKey.SetAccessControl($acl)
--
 
--
       ### Step 3 - enable inheritance of permissions (not ownership) for current key from parent
--
       $acl.SetAccessRuleProtection($false, $false)
--
       $regKey.SetAccessControl($acl)
--
 
--
       ### Step 4 - only for top-level key, change permissions for current key and propagate it for subkeys
--
       # to enable propagations for subkeys, it needs to execute Steps 2-3 for each subkey (Step 5)
--
       if ($recurseLevel -eq 0) {
--
           $regKey = $regKey.OpenSubKey('', 'ReadWriteSubTree', 'ChangePermissions')
--
           $rule = New-Object System.Security.AccessControl.RegistryAccessRule($sid, 'FullControl', 'ContainerInherit', 'None', 'Allow')
--
           $acl.ResetAccessRule($rule)
--
           $regKey.SetAccessControl($acl)
--
       }
--
 
--
       ### Step 5 - recursively repeat steps 2-5 for subkeys
--
       if ($recurse) {
--
           foreach($subKey in $regKey.OpenSubKey('').GetSubKeyNames()) {
--
               Take-KeyPermissions $rootKey ($key+'\'+$subKey) $sid $recurse ($recurseLevel+1)
--
           }
--
       }
--
   }
--
 
--
   Take-KeyPermissions $rootKey $key $sid $recurse
--
}
--
 
--
<# REGISTRY KEYS DELETION #>
--
 
--
$currentIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
--
$sid = $currentIdentity.User.Translate([System.Security.Principal.SecurityIdentifier])
--
 
--
foreach ($regKey in $RegKeys) {
--
   [String]$path = $regKey.Path
--
   [String]$root = $path -replace '^(.*?)\\.*', '$1'
--
   [String]$key = $path -replace "$root\\", ""
--
   [Boolean]$isLiteralPath = $regKey.IsLiteralPath
--
 
--
   if (-not $isLiteralPath) {
--
       $key = $key.Substring(0, $key.LastIndexOf('*'))
--
       $key = $key.Substring(0, $key.LastIndexOf('\'))
--
   }
--
 
--
   Write-Host "Taking registry permissions for: $root\$key"
--
   try { Take-Permissions $root $key $sid $true } catch { }
--
 
--
   [Boolean]$testPath = if ($isLiteralPath) { Test-Path -LiteralPath "Registry::$path" } else { Test-Path "Registry::$path" }
--
   if ($testPath) {
--
       try {
--
           if ($isLiteralPath) {
--
               Remove-Item -LiteralPath "Registry::$path" -Recurse -ErrorAction Stop
--
           } else {
--
               Remove-Item -Path "Registry::$path" -Recurse -ErrorAction Stop
--
           }
--
           Write-Host "Registry key deleted: $path"
--
       } catch {
--
           Write-Error $_.Exception.Message
--
       }
--
   } else {
--
       Write-Warning "Registry key not found: $path"
--
   }
--
   Write-Host ""
--
}
--
 
--
<# END #>
--
 
--
Write-Host "Operation Completed.`n"-BackgroundColor Black -ForegroundColor Green
--
Write-Host "Press any key to exit..."
--
$Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown") | Out-Nu
--
Exit(0)
--


zelarra:

Hola, muchas gracias, acabo de probarlo y esto es el resultado:

https://ibb.co/4NRRP2h

Eleкtro:

Cita de: zelarra en 18 Marzo 2024, 19:46 pm
--
Hola, muchas gracias, acabo de probarlo y esto es el resultado:

https://ibb.co/4NRRP2h

--

Te sugiero que vuelvas a probar el script, pero esta vez ejecútalo desde la cuenta integrada "Administrador" en Windows.

Para activar la cuenta integrada "Administrador", y asumiendo que tengas suficientes permisos de usuario para ello, simplemente abre la CMD y escribe el siguiente comando:

Código:
--
net user administrador /active:yes
--
- https://petri.com/how-to-enable-built-in-administrator-account-windows-10/

Una vez que la cuenta integrada "Administrador" esté activa, simplemente inicia sesión en dicha cuenta de usuario, y ejecuta el script de PowerShell para que el script vuelva a intentar realizar las modificaciones de permisos de usuario sobre las claves de la rama HKLM.


En caso de que la metodología de adquisición de permisos sobre las claves del registro de la rama HKLM mediante PowerShell te siga fallando, en ese caso te sugiero, desde la cuenta "Administrador", seguir las siguientes indicaciones:

1. Descarga del siguiente enlace el programa de terceros por línea de comandos 'SetACL' (no confundir con 'SetACL Studio'):
https://helgeklein.com/download/
2. Coloca el archivo executable descargado, "setacl.exe", junto a este batch-script en la misma carpeta:

SetAcl.cmd
Código
--
@ECHO OFF
--
 
--
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package"
--
 
--
".\SETACL.exe" -on "%RegKey%" -ot "reg" ^
--
              -actn "setowner" -ownr "n:%UserName%" -rec "Yes" ^
--
              -actn "ace" -ace "n:%UserName%;p:full;m:Grant" -rec "Yes"
--
 
--
PAUSE & EXIT
--

3. Ejecuta el script. Deberías ver algo como esto:



En caso de que te de error indicando que no se ha podido realizar correctamente la operación en el registro, modifica el valor de esta variable:

Código:
--
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package"
--

Por este otro valor:
Código:
--
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom"
--

Y vuelve a ejecutar el script.

En caso de que te siga dando error, sigue acortando el valor, y volviendo a ejecutar el script con la clave de registro acortada, hasta llegar a la raíz HKLM:

Código:
--
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes"
--
Código:
--
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE"
--
Código:
--
Set "RegKey=HKEY_LOCAL_MACHINE"
--

La idea es modificar el propietario y obtener permisos completos de las claves de registro donde sea estrictamente necesario obtenerlos, preferiblemente NO en la rama HKLM al completo, por eso te he indicado que vayas acortando el valor (la ruta del registro) poco a poco mientras vas ejecutando el batch-script por cada cambio que hagas.

Con estas indicaciones, desde el punto nº1 al nº3, se asume que entiendes los posibles riesgos que puede conllevar modificar los permisos de usuario de las claves del registro de Windows. No me hago responsable de un posible malfuncionamiento en el sistema operativo tras aplicar cambios de permisos de usuario en el registro de Windows.

Aténtamente,
Elektro.

Páginas: << < (2/3) > >>