Una volta che il mio programma è installato su un computer client, come posso forzare l'esecuzione del mio programma come amministratore su Windows 7?
Una volta che il mio programma è installato su un computer client, come posso forzare l'esecuzione del mio programma come amministratore su Windows 7?
Risposte:
Ti consigliamo di modificare il manifest che viene incorporato nel programma. Funziona su Visual Studio 2008 e versioni successive: Progetto + Aggiungi nuovo elemento, selezionare "File manifest dell'applicazione". Cambia l' <requestedExecutionLevel>
elemento in:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
L'utente riceve il prompt UAC all'avvio del programma. Usa saggiamente; la loro pazienza può logorarsi rapidamente.
L'aggiunta di un requestedExecutionLevel
elemento al tuo manifest è solo metà della battaglia; devi ricordare che UAC può essere disattivato. In tal caso, devi eseguire il controllo alla vecchia maniera e creare una finestra di dialogo di errore se l'utente non è amministratore
(chiama IsInRole(WindowsBuiltInRole.Administrator)
il tuo thread CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
anche
IsInRole
parla Anders.
I passaggi dettagliati sono i seguenti.
Si noti che utilizzando questo codice è necessario disattivare le impostazioni di sicurezza di ClickOnce, per farlo, accedere a Proprietà -> Sicurezza -> Sicurezza ClickOnce
New Item...
non è un'opzione nel mio progetto di servizio di installazione. Come farei per aggiungere l'app manifest? Posso aggiungerlo al mio progetto principale ma non è il programma di installazione.
Ho implementato del codice per farlo manualmente:
using System.Security.Principal;
public bool IsUserAdministrator()
{
bool isAdmin;
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (UnauthorizedAccessException ex)
{
isAdmin = false;
}
catch (Exception ex)
{
isAdmin = false;
}
return isAdmin;
}
È possibile incorporare un file manifest nel file EXE, in modo che Windows (7 o versione successiva) esegua sempre il programma come amministratore.
È possibile trovare ulteriori dettagli nel Passaggio 6: Creare e incorporare un manifest (UAC) (MSDN).
Mentre lavori su Visual Studio 2008, fai clic con il pulsante destro del mouse Project -> Add New Item
e scegli Application Manifest File
.
Nel file manifest, troverai il tag requestedExecutionLevel
e puoi impostare il livello su tre valori:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
O
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
O
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Per impostare la tua applicazione come amministratore, devi scegliere quella centrale.
Come da
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
vorrai aggiungere un manifest dell'applicazione se non ne hai già uno o non sai come aggiungerne uno. Poiché alcuni progetti non aggiungono automaticamente un file manifest separato, prima vai alle proprietà del progetto, vai alla scheda Applicazione e controlla per assicurarti che il tuo progetto non escluda il manifest nella parte inferiore del tocco.
In Visual Studio 2010 fai clic con il pulsante destro del mouse sul nome del tuo progetto. Premi "Visualizza impostazioni di Windows", questo genera e apre un file chiamato "app.manifest". All'interno di questo file sostituisci "asInvoker" con "requestAdministrator" come spiegato nelle sezioni commentate all'interno del file.
Un altro modo per farlo, solo nel codice, è rilevare se il processo è in esecuzione come admin come nella risposta di @NG. . Quindi riaprire l'applicazione e chiudere quella corrente.
Uso questo codice quando un'applicazione necessita solo dei privilegi di amministratore quando viene eseguita in determinate condizioni, ad esempio durante l'installazione come servizio. Quindi non è necessario che funzioni sempre come amministratore come le altre risposte lo costringono.
Nota nel codice seguente NeedsToRunAsAdmin
è un metodo che rileva se nelle condizioni attuali sono richiesti i privilegi di amministratore. Se questo restituisce false
il codice non si eleverà da solo. Questo è un grande vantaggio di questo approccio rispetto agli altri.
Sebbene questo codice abbia i vantaggi sopra indicati, deve riavviarsi come nuovo processo che non è sempre quello desiderato.
private static void Main(string[] args)
{
if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Assembly.GetEntryAssembly().CodeBase;
foreach (string arg in args)
{
proc.Arguments += String.Format("\"{0}\" ", arg);
}
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch
{
Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
}
}
else
{
//Normal program logic...
}
}
private static bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
runas
come amministratore da un utente non amministratore, altrimenti si aprirà silenziosamente con le autorizzazioni dell'utente corrente (spuntato su Windows 7 64 bit). Per quanto ne so, l'unica cosa che puoi fare con UAC disabilitato e manca il diritto di amministrazione è di fermare l'esecuzione in un momento opportuno.
È possibile creare il manifest utilizzando le Impostazioni di sicurezza di ClickOnce e quindi disabilitarlo:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Dopo aver fatto clic su di esso, verrà creato un file nella cartella delle proprietà del Progetto chiamato app.manifest una volta creato, è possibile deselezionare l' Enable ClickOnce Security Settings
opzione
Apri quel file e cambia questa riga:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
per:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Ciò renderà il programma necessario i privilegi di amministratore.
Questa è una versione semplificata di questa risposta , sopra di @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Fare clic con il tasto destro del mouse sull'eseguibile, selezionare Proprietà> Compatibilità e selezionare la casella "Esegui questo programma come amministratore".
Se vuoi eseguirlo come amministratore per tutti gli utenti, fai la stessa cosa in "cambia impostazione per tutti gli utenti".