[C#] Endurræsing á þjónustu
Sent: 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:
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;
}
}