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

Skjámynd

Höfundur
Revenant
</Snillingur>
Póstar: 1034
Skráði sig: Fim 24. Jún 2004 12:36
Reputation: 132
Staða: Ótengdur

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

Pósturaf Revenant » Mán 09. Jan 2012 22:49

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;
   }

}




SteiniP
Bara að hanga
Póstar: 1573
Skráði sig: Mán 16. Jún 2008 21:54
Reputation: 1
Hafðu samband:
Staða: Ótengdur

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

Pósturaf SteiniP » Mán 09. Jan 2012 23:39

Þú 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.



Skjámynd

hagur
Besserwisser
Póstar: 3123
Skráði sig: Mið 17. Des 2003 16:11
Reputation: 454
Hafðu samband:
Staða: Ótengdur

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

Pósturaf hagur » Mán 09. Jan 2012 23:57




Skjámynd

Höfundur
Revenant
</Snillingur>
Póstar: 1034
Skráði sig: Fim 24. Jún 2004 12:36
Reputation: 132
Staða: Ótengdur

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

Pósturaf Revenant » Þri 10. Jan 2012 00:19

É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.



Skjámynd

Hjaltiatla
Besserwisser
Póstar: 3172
Skráði sig: Mið 07. Okt 2009 20:54
Reputation: 546
Staðsetning: ::1
Staða: Tengdur

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

Pósturaf Hjaltiatla » Þri 10. Jan 2012 01:18

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


Just do IT
  √


SteiniP
Bara að hanga
Póstar: 1573
Skráði sig: Mán 16. Jún 2008 21:54
Reputation: 1
Hafðu samband:
Staða: Ótengdur

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

Pósturaf SteiniP » Þri 10. Jan 2012 02:25

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ð?