UAC أو UserLevel كيفية التغلب عليه!
-
28-09-2019 - |
سؤال
أحاول إعادة تشغيل خدمة برمجيًا من داخل تطبيق المساعد المكتوب في C# (على .NET 4.0) ، لكنني أحصل على انتهاك للإذن إذا قمت بتشغيل EXE بالنقر المزدوج أثناء النقر الأيمن والقيام "بتشغيل المسؤول".
ولكن لماذا أحتاج إلى هذا ، المستخدمون هم مدراء محليون؟!
أود تشغيل التطبيق بشكل طبيعي ولا يطلب سوى حقوق المسؤول عندما ينقر المستخدم على الزر لإعادة تشغيل الخدمة. هل يمكن هذا؟
يحتاج الحل إلى العمل على XP و Vista و Windows 7.
أنا أستخدم هذا الرمز من http://www.csharp-examples.net/restart-windows-service/
public static void RestartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
// ...
}
}
المحلول
قم بعمل مشروع تطبيق وحدة تحكم جديدة مثل هذا:
public class RunService
{
static int Main()(string[] args)
{
//TODO read serviceName and timeoutMilliseconds from args
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1)); service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
// TODO return status code
}
catch
{
// ...
}
}
}
في مشروعك ، أضف مرجعًا إلى المشروع العلوي واستخدم شيئًا كهذا للاتصال بالقابل للتنفيذ. ليس استخدام الفعل Runas ، مما سيؤدي إلى دفع المستخدم لحقوق الارتفاع.
var process = Process.Start(new ProcessStartInfo
{
Verb = "runas",
FileName = typeof(RunService).Assembly.Location,
UseShellExecute = true,
CreateNoWindow = true,
});
process.WaitForExit();
var exitCode = process.ExitCode
// TODO process exit code...
نصائح أخرى
لا يمكنك تخطي/تجاهل طلب إذن UAC (من شأنه أن ينفي بشكل أساسي استخدامه بالكامل) ولكن المدير المتصدر قد يكون ما تبحث عنه. لم تستخدمه حتى الآن.