Crie atalhos programaticamente a partir de C# e defina a propriedade "Run como administrador"

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

  •  26-09-2019
  •  | 
  •  

Pergunta

Eu já sei como criar atalhos programaticamente a partir dos meus aplicativos C# usando IWshRuntimeLibrary e WshShellClass. Ou eu poderia usar IShellLink.

Agora, se o PC do usuário estiver executando o Windows Vista ou o Windows 7, gostaria de poder definir o "Executar como administrador" propriedade desse atalho também programaticamente.

Isso é possível? Se sim, como?

alt text

Foi útil?

Solução

Embora a resposta de Doug seja a solução correta para esse problema, não é a resposta para esta pergunta específica ...

Para definir essa propriedade em um .lnk, você precisa usar o Ishelllinkdatalist Interface com. O grande Raymond Chen tem Código de amostra C ++ em seu blog por esta

Outras dicas

Você vai precisar Crie um arquivo de manifesto Para sua inscrição, para solicitar que seja executado como privilégios de administrador. Aqui está um bom tutorial que você pode seguir.

Apreciar!

Este exemplo está em PowerShell, mas usa os mesmos objetos e classes que C#.

Use o código a seguir para obter o número do byte para 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])  
    } 
}

Eu tenho byte número 21 e seu valor era 34. Então este é o script que eu usuário:

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

Com este método, você pode criar um atalho que a propriedade "executada como administrador" está definida:

    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);
            }
    }

Crédito para execução como seção de administrador pertence a aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top