سؤال

أحاول إعادة تشغيل خدمة برمجيًا من داخل تطبيق المساعد المكتوب في 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 (من شأنه أن ينفي بشكل أساسي استخدامه بالكامل) ولكن المدير المتصدر قد يكون ما تبحث عنه. لم تستخدمه حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top