Powershell Ayuda

Iniciado por rigorvzla, 20 Diciembre 2021, 20:50 PM

0 Miembros y 1 Visitante están viendo este tema.

rigorvzla

Hola amigos, espero todos esten bien, estoy buscando de crear una pequeña app que ejecute esta linea de comandos en powershell

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" -Name DevicePasswordLessBuildVersion -Value 0 -Type Dword -Force

Y no tengo ni la mas remota idea de como hacerlo, eh buscado en internet y me eh guiado con ese ejemplo, como resultado este codigo

  PowerShell ps = PowerShell.Create();
            ps.AddCommand(@"New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device -Name DevicePasswordLessBuildVersion -Value 0 -Type Dword -Force");
            ps.Invoke();


Pero no funciona y no tengo la mas remota idea de como seria, ya que el ejemplo es muy simple para lo que quiero hacer al parecer.

De antemano gracias .

EdePC

Dependerá de tu App el método para hacer el llamado con parámetros a otra aplicación, en este caso un PowerShell. Aunque no es tan necesario recurrir a una Shell PowerShell para algo tan simple, directamente puedes llamar a Reg.exe y pasarle los parámetros:

IMPORTANTE: Recuerda que para modificar HKLM se requieren permisos de Administrador

Código (bash) [Seleccionar]
Reg.exe Add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" /V DevicePasswordLessBuildVersion /T REG_DWORD /D 0 /F

Si necesitas llamar a PowerShell.exe entonces el comando sería:

Código (bash) [Seleccionar]
PowerShell.exe New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device" -Name DevicePasswordLessBuildVersion -Value 0 -Type Dword -Force

Yo evito usar PowerShell siempre que puedo porque su primer arranque es muy lento, además debes considerar también que el Path debe existir sino dará error

rigorvzla

eh usado el primer metodo y lo eh planteado asi:

   ProcessStartInfo p = new ProcessStartInfo("reg.exe");
            p.Arguments = @"add HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device / V DevicePasswordLessBuildVersion / T REG_DWORD / D 0 / F";
            Process.Start(p);


mas no se si asi como lo hice , es que deberia . ya que al ejecutarlo abre una ventana dos la cual se cierra de inmediato y no se si resulto el comando, si me guias un poco mas porfavor.

Mohicano

#3
Ese script no te va a funcionar ya que tienes fallos de sintaxis.

Regla básica y fundamental en el uso de parámetros por linea de comandos para cualquier programa:
- Los argumentos con espacios en blanco hay que encerrarlos entre comillas.

Ej.
Programa.exe /Parametro "Valor con espacios"

Aparte, el símbolo y nombre de un parámetro se escribe sin espacios en blanco: "/Nombre", no "/ Nombre"

De todas formas todo eso daría igual, ya que si vas a utilizar PowerShell lo más lógico es utilizar sus funcionalidades integradas, no recurrir y depender de programas externos como REG.exe. El compañero EdePC te ha mostrado un ejemplo de cómo hacerlo.

Aun así, si quieres utilizar REG.exe, lo podrías hacer de la siguiente manera:

Código (csharp) [Seleccionar]
function AddRegistryValue {

   param (
       [Parameter(Mandatory, Position=0, HelpMessage="Enter the registry path.")]
       [string]$path,

       [Parameter(Mandatory, Position=1, HelpMessage="Enter the name of the registry value.")]
       [AllowEmptyString()]
       [string]$value,

       [Parameter(Mandatory, Position=2, HelpMessage="Enter the value type.")]
       [string]$type,

       [Parameter(Mandatory, Position=3, HelpMessage="Enter the value data.")]
       [AllowEmptyString()]
       [string]$data
   )

   [int32]$result = 0

   $p = New-Object System.Diagnostics.Process
   $p.StartInfo.FileName  = "REG.exe"
   $p.StartInfo.Arguments = "ADD ""$path"" /V ""$value"" /T ""$type"" /D ""$data"" /F"
   $p.StartInfo.UseShellExecute = $false
   $p.StartInfo.CreateNoWindow  = $false
   $p.StartInfo.RedirectStandardOutput = $true
   $p.StartInfo.RedirectStandardError  = $true

   $p.Start() | Out-Null
   $stdOut = $p.StandardOutput.ReadToEnd()
   $stdErr = $p.StandardError.ReadToEnd()
   $p.WaitForExit()
   $result = $p.ExitCode
   $p.Close()

   Write-Host $p.StartInfo.FileName $p.StartInfo.Arguments
    Write-Host $stdOut
   Write-Host $stdErr

   return $result
}

function Pause {
   param (
       [Parameter(Mandatory=$false, Position=0, HelpMessage="Enter the message to display.")]
       [string]$message = "Press any key to continue..."
   )

   $console = [System.Console]
   $console::WriteLine($message)
   $console::ReadKey($true) | Out-Null

}  

AddRegistryValue -Path  'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device' `
                -Value 'DevicePasswordLessBuildVersion' `
                -Type  'REG_DWORD' `
                -Data  '0' `
                | Out-Null

Pause
Exit(0)