Crear accesos directos mediante programación de C # y conjunto “Ejecutar como administrador” propiedad

StackOverflow https://stackoverflow.com/questions/4036081

  •  26-09-2019
  •  | 
  •  

Pregunta

Ya sabe cómo crear accesos directos mediante programación desde mis aplicaciones C # utilizando IWshRuntimeLibrary y WshShellClass. O podría utilizar IShellLink.

Ahora bien, si el PC del usuario está ejecutando Windows Vista o Windows 7, me gustaría ser capaz de establecer el "Ejecutar como administrador" propiedad de ese acceso directo programmactically también.

¿Es posible? Si es así, ¿cómo?

text alt

¿Fue útil?

Solución

Si bien la respuesta de Doug es la solución correcta a este problema, no es la respuesta a esta pregunta específica ...

Para establecer esa propiedad en una .lnk, es necesario utilizar el IShellLinkDataList interfaz COM. La gran Raymond Chen tiene C ++ en su blog para este

Otros consejos

tendrá que crear un archivo de manifiesto para su aplicación con el fin de conseguir que la solicitud se ejecute como privilegios de administrador. Aquí es un buen tutorial puede seguir.

Disfrute!

Este ejemplo es en PowerShell, pero se utiliza los mismos objetos y clases como C #.

Utilice el código siguiente para obtener el número de bytes a activtae:

# Find the missing admin byte (use this code, when changing the link):
$adminon = [System.IO.File]::ReadAllBytes($shortCutLocation)
$adminof = [System.IO.File]::ReadAllBytes($shortCutLocation)
for ($i = 0; $i -lt $adminon.Count; $i++) { 
    if ($adminon[$i] -ne $adminof[$i]) { 
        Write-Host Location: $i Value: $($adminon[$i])  
    } 
}

Tengo el byte número 21 y su valor era 34. Así que este es el usuario guión que:

# Turning on the byte of "Run as Admin"
$lnkBytes = [System.IO.File]::ReadAllBytes($shortCutLocation)
$lnkBytes[21] = 34
[System.IO.File]::WriteAllBytes($shortCutLocation, $lnkBytes)

Con este método se puede crear un acceso directo que la propiedad “Ejecutar como administrador” se establece:

    void CreateShortcut(string shortcutPath, string sourcePath, bool runAsAdmin, params string[] args)
    {
        var shortcut = new IWshShell_Class().CreateShortcut(shortcutPath) as IWshShortcut;
        shortcut.TargetPath = System.IO.Path.GetFullPath(sourcePath);
        shortcut.Arguments = "\"" + string.Join("\" \"", args) + "\"";
        shortcut.Save();

        if (runAsAdmin)
            using (var fs = new FileStream(shortcutPath, FileMode.Open, FileAccess.ReadWrite))
            {
                fs.Seek(21, SeekOrigin.Begin);
                fs.WriteByte(0x22);
            }
    }

El crédito para Ejecutar como administrador de la sección pertenece a aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top