Une fois mon programme installé sur une machine cliente, comment puis-je forcer mon programme à s'exécuter en tant qu'administrateur sur Windows 7?
Une fois mon programme installé sur une machine cliente, comment puis-je forcer mon programme à s'exécuter en tant qu'administrateur sur Windows 7?
Réponses:
Vous voudrez modifier le manifeste qui est incorporé dans le programme. Cela fonctionne sur Visual Studio 2008 et supérieur: Projet + Ajouter un nouvel élément, sélectionnez "Fichier manifeste d'application". Remplacez l' <requestedExecutionLevel>
élément par:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
L'utilisateur reçoit l' invite UAC lorsqu'il démarre le programme. Utilisez judicieusement; leur patience peut s'user rapidement.
L'ajout d'un requestedExecutionLevel
élément à votre manifeste ne représente que la moitié de la bataille; vous devez vous rappeler que l' UAC peut être désactivé. Si c'est le cas, vous devez effectuer la vérification à l'ancienne et mettre en place une boîte de dialogue d'erreur si l'utilisateur n'est pas administrateur
( IsInRole(WindowsBuiltInRole.Administrator)
faites appel à votre thread CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
également
IsInRole
, Anders en parle.
Les étapes détaillées sont les suivantes.
Notez que l'utilisation de ce code vous devez désactiver les paramètres de sécurité de ClickOnce, pour ce faire, allez dans Propriétés -> Sécurité -> Sécurité ClickOnce
New Item...
n'est pas une option sur mon projet de service d'installation. Comment pourrais-je ajouter le manifeste de l'application? Je peux l'ajouter à mon projet principal mais pas à son installateur.
J'ai implémenté du code pour le faire manuellement:
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;
}
Vous pouvez incorporer un fichier manifeste dans le fichier EXE, ce qui obligera Windows (7 ou supérieur) à toujours exécuter le programme en tant qu'administrateur.
Vous pouvez trouver plus de détails à l' étape 6: créer et incorporer un manifeste d'application (UAC) (MSDN).
Tout en travaillant sur Visual Studio 2008, faites un clic droit sur Project -> Add New Item
puis choisissez Application Manifest File
.
Dans le fichier manifeste, vous trouverez la balise requestedExecutionLevel
et vous pouvez définir le niveau sur trois valeurs:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
OU
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
OU
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Pour configurer votre application pour qu'elle s'exécute en tant qu'administrateur, vous devez choisir celle du milieu.
Selon
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
vous voudrez ajouter un manifeste d'application si vous n'en avez pas déjà un ou si vous ne savez pas comment en ajouter un. Comme certains projets n'ajoutent pas automatiquement un fichier manifeste distinct, accédez d'abord aux propriétés du projet, accédez à l' onglet Application et vérifiez que votre projet n'exclut pas le manifeste au bas du robinet.
Dans Visual Studio 2010, cliquez avec le bouton droit sur le nom de votre projet. Appuyez sur "Afficher les paramètres Windows", cela génère et ouvre un fichier appelé "app.manifest". Dans ce fichier, remplacez "asInvoker" par "requireAdministrator" comme expliqué dans les sections commentées du fichier.
Une autre façon de le faire, en code uniquement, consiste à détecter si le processus s'exécute en tant qu'administrateur comme dans la réponse de @NG. . Et puis ouvrez à nouveau l'application et fermez celle en cours.
J'utilise ce code lorsqu'une application n'a besoin que de privilèges d'administrateur lorsqu'elle est exécutée dans certaines conditions, comme lors de l'installation elle-même en tant que service. Il n'a donc pas besoin d'être exécuté en tant qu'administrateur tout le temps comme les autres réponses le forcent également.
Remarque dans le code ci-dessous NeedsToRunAsAdmin
est une méthode qui détecte si dans les conditions actuelles des privilèges d'administrateur sont requis. Si cela retourne, false
le code ne s'élèvera pas. C'est un avantage majeur de cette approche par rapport aux autres.
Bien que ce code présente les avantages mentionnés ci-dessus, il a besoin de se relancer en tant que nouveau processus qui n'est pas toujours ce que vous voulez.
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
tant qu'administrateur à partir d'un utilisateur non administrateur, sinon il s'ouvrira silencieusement avec les autorisations utilisateur actuelles (vérifié sur Windows 7 64 bits). Pour autant que je sache, la seule chose que vous pouvez faire avec l'UAC désactivé et le droit d'administrateur manquant est d'arrêter l'exécution au bon moment.
Vous pouvez créer le manifeste à l'aide des paramètres de sécurité ClickOnce, puis le désactiver:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Après avoir cliqué dessus, un fichier sera créé sous le dossier des propriétés du projet appelé app.manifest une fois celui-ci créé, vous pouvez décocher l' Enable ClickOnce Security Settings
option
Ouvrez ce fichier et changez cette ligne:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
à:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Cela rendra le programme nécessitera des privilèges d'administrateur.
Ceci est une version simplifiée de cette réponse , ci-dessus par @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Cliquez avec le bouton droit sur votre exécutable, accédez à Propriétés> Compatibilité et cochez la case «Exécuter ce programme en tant qu'administrateur».
Si vous souhaitez l'exécuter en tant qu'administrateur pour tous les utilisateurs, faites la même chose dans «Modifier les paramètres pour tous les utilisateurs».