[Q] C# administratör-privilegier

Permalänk
Medlem

[Q] C# administratör-privilegier

Ja tja igen.

Jag har jobbat på ett program i C# och är nästan klar med det, det enda som saknas är administratör-privilegier. Jag har googlat och jag har läst Skarp programmering med C# och Visual C# 2010 men ingen av dessa böcker verkar gå igenom detta. Problemet som uppstår är att mitt program inte får utföra specifika åtgärder utan att ha godkännande från UAC alt. inloggade användaren..

Dessutom följdfråga, är det värt att lära sig C++?

Vad är lösningen och är det värt?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

Lösningen på vadå? Om programmet kräver administratörsrättigheter så måste användaren godkänna detta.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem
Skrivet av MagnusL:

Lösningen på vadå? Om programmet kräver administratörsrättigheter så måste användaren godkänna detta.

Medveten, men finns det ingen metod för att exempelvis filhantering på C:\ ska vara tillåten för applikationen. Mer att tvinga in den i adminstratörsrättigheter.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

Om du vill tvinga in den så måste du starta den som administratör det kan du lätt göra med några få rader, kolla om appen har administratörs rättigheter, om inte starta appen i appen som Administratör.

Ska bara några specifika saker göras så kan man göra det på andra sätt t.ex. ett demo jag skrev ihop för mycket länge sedan har du här. Du har också koden där för att lära något som Administratör.

Värt att notera att det går inte requesta en redan existerande process att bli administratör utan du måste skapa en ny. Detta är hur Windows fungerar så finns inga vägar runt detta.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Principal; using System.Diagnostics; using System.ComponentModel; using System.Reflection; using System.IO; namespace RunAsAdmin { class Program { static void Main(string[] args) { if (RunAdminCommands(args)) { Console.ReadKey(); return; } else { //RunTheAppAsNormal. } Console.ReadKey(); } private static bool RunAdminCommands(string[] args) { WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator); Console.WriteLine(hasAdministrativeRight); if (args.Count() > 0 && args[0] == "-register") { Console.WriteLine("Register...."); if (hasAdministrativeRight) RunRegisterCode(); else RequestAdminRights(args); return true; } return false; } private static void RequestAdminRights(string[] args) { Console.WriteLine("Requesting Admin Rights"); ProcessStartInfo processInfo = new ProcessStartInfo(); processInfo.Verb = "runas"; processInfo.Arguments = string.Join(" ", args); processInfo.FileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @\RunAsAdmin.exe; Console.WriteLine(processInfo.FileName); try { Process.Start(processInfo); } catch { Console.WriteLine("Some Problem"); } } private static void RunRegisterCode() { Console.WriteLine("Running registering stuff..."); } } }

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Medlem
Skrivet av MugiMugi:

Har jobbat otroligt lite med det som har med System.IO att göra och försöker lära mig det.

Antar att den skulle köras i if-satsen:

if (RunAdminCommands(args)) { //HÄR? }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem

Om du bara vill se till att ditt program startar som Administratör ( lättast i detta fallet så ) använd bara denna kod

dvs ditt projekt, allt du behöver göra är att lägga till är metoderna i ditt Program.cs samt lägnst upp i main ha
if (RunProgramAsAdmin(args))
return;

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Principal; using System.Diagnostics; using System.ComponentModel; using System.Reflection; using System.IO; namespace RunAsAdmin { class Program { static void Main(string[] args) { if (RunProgramAsAdmin(args)) return; //Your standard code goes here } private static bool RunProgramAsAdmin(string[] args) { WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); if (pricipal.IsInRole(WindowsBuiltInRole.Administrator)) return false; RequestAdminRights(args); return true; } private static bool RequestAdminRights(string[] args) { ProcessStartInfo processInfo = new ProcessStartInfo() { Verb = "runas", Arguments = string.Join(" ", args), FileName = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) }; try { Process.Start(processInfo); return true; } catch { return false; } } } }

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.