Síða 1 af 1

[C#] Endurræsing á þjónustu

Sent: Mán 09. Jan 2012 22:49
af Revenant
Hæhæ ég er í smá vandræðum með endurræsingakóða sem endurræsir þjónustu á remote machine (t.d. server). Þessi kóði virkar fyrir XP/Server 2003 en í Vista/2008/7/2008R2 þá lendi ég í access vandræðum m.a. útaf UAC. Notandinn sem notaður hefur öll tilskilin réttindi til að endurræsa service-ið.

Spurningin er því:
Er hægt að breyta þessum kóða fyrir nýrri kerfi en XP/2003 (eða m.ö.o. hvað þarf að breyta server side að þetta virki)
Eða er til önnur leið til að endurræsa service-ið (t.d. í gegnum bat skrá eða powershell?)

Kóði:

Kóði: Velja allt

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
   int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

...


IntPtr token = IntPtr.Zero;
LogonUser(uname, dmain, pword, (int)LogonType.NewCredentials, (int)LogonProvider.WinNT50, ref token);

try
{
   using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(token))
   using (ServiceController sc = new ServiceController(SERVICE_NAME, IP_ADDRESS))
   {
      sc.Stop();
      sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 15));
      sc.Start();
      sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 15));
   }
}
catch (Exception e)
{
   // Handle exception
}
finally
{
   if (token != IntPtr.Zero)
   {
      CloseHandle(token);
      token = IntPtr.Zero;
   }

}

Re: [C#] Endurræsing á þjónustu

Sent: Mán 09. Jan 2012 23:39
af SteiniP
Þú getur endurræst service með batch skipun

Kóði: Velja allt

net stop nameofservice
net start nameofservice


Þetta virkar í öllum Windows, allavega frá XP og upp.
Þú þyrftir samt að keyra bat fælinn með administrator réttindum, en þú gætir líklega bara hent upp UAC prompt þegar hann fer í gang.

AFAIK þá getur process ekki tekið admin réttindi eftir að það er komið í gang. UAC gefur réttindin áður en processið fer í gang, þannig að þú þyrftir annaðhvort að keyra allt forritið með administrator réttindum eða nota annað process til að framkvæma svona aðgerðir.

Re: [C#] Endurræsing á þjónustu

Sent: Mán 09. Jan 2012 23:57
af hagur

Re: [C#] Endurræsing á þjónustu

Sent: Þri 10. Jan 2012 00:19
af Revenant
Ég klikkaði á að segja að sá sem keyrir forritið hefur ekki aðgang að vélinni (þ.e. service restart-ið fer fram í gegnum RPC frá annari tölvu). Þess vegna er ég með WindowsImpersonationContext til að breyta um notanda.

Re: [C#] Endurræsing á þjónustu

Sent: Þri 10. Jan 2012 01:18
af Hjaltiatla
Varstu búinn að prófa Winrm
http://www.youtube.com/watch?v=llf3sKFmtOo

Það er að segja ef ég er að skilja framkvæmdina rétt :-k

Re: [C#] Endurræsing á þjónustu

Sent: Þri 10. Jan 2012 02:25
af SteiniP
Gætirðu ekki bara búið til þjónustu sem keyrir undir administrator á servernum og restartar þá öðrum þjónustum þegar client sendir boð um það?