Creare collegamenti a livello di codice da C # e set “Esegui come amministratore” proprietà
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?
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