Creare collegamenti a livello di codice da C # e set “Esegui come amministratore” proprietà

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

  •  26-09-2019
  •  | 
  •  

Domanda

so già come creare scorciatoie di programmazione dalle mie applicazioni C # utilizzando IWshRuntimeLibrary e WshShellClass. O potrei usare IShellLink.

Ora, se il PC dell'utente è in esecuzione Windows Vista o Windows 7, vorrei essere in grado di impostare il "Esegui come amministratore" di proprietà di quel collegamento programmactically pure.

è possibile? Se sì, come?

alt text

È stato utile?

Soluzione

Mentre la risposta di Doug è la soluzione corretta a questo problema, non è la risposta a questa specifica domanda ...

Per impostare la proprietà su un .lnk, è necessario utilizzare il IShellLinkDataList COM interfaccia. Il grande Raymond Chen ha C ++ sul suo blog per questo

Altri suggerimenti

Sarà necessario creare un file manifesto per la vostra applicazione, al fine di farlo richiesta eseguito come i privilegi di amministratore. Ecco un bel tutorial può seguire.

Enjoy!

Questo esempio è in PowerShell, ma si utilizza gli stessi oggetti e classi come C #.

Utilizza il seguente codice per ottenere il numero di byte per 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])  
    } 
}

ho ottenuto il numero di byte 21 e il suo valore era 34. Quindi questo è l'utente script che ho:

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

Con questo metodo è possibile creare un collegamento che “Esegui come amministratore” è impostata:

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

Credito per Esegui come sezione amministrativa appartiene a qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top