Мне нужно создать сервисную программу, которая никогда не будет закрыта пользователем даже с правами администратора. Это будет не вирусная программа, а просто программа для использования в какой-либо работе. Я должен запретить пользователю изменять тип запуска службы и убивать из диспетчера задач.
Я пытался использовать код, чтобы постоянно изменять тип запуска в реестре службы, но каким-то образом реестр не будет изменятьсяservice.
public partial class WindowsAuditService : ServiceBase
{
Timer m_timer = null;
ServiceHost m_svcHost = null;
[DllImport("kernel32.dll")]
private static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
public enum ServiceStart
{
Boot = 0,
System = 1,
Automatic = 2,
Manual = 3,
Disabled = 4
}
public WindowsAuditService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
m_timer = new Timer();
m_timer.Interval = 5000;
m_timer.Elapsed += Timer_Elapsed;
m_timer.Enabled = true;
m_timer.Start();
if (m_svcHost != null)
m_svcHost.Close();
string strAdrTCP = "net.tcp://localhost:18085/NMService";
Uri[] adrbase = { new Uri(strAdrTCP) };
m_svcHost = new ServiceHost(typeof(NMService), adrbase);
ServiceMetadataBehavior mBehave = new ServiceMetadataBehavior();
m_svcHost.Description.Behaviors.Add(mBehave);
NetTcpBinding tcpb = new NetTcpBinding();
m_svcHost.AddServiceEndpoint(typeof(INMService), tcpb, strAdrTCP);
m_svcHost.AddServiceEndpoint(typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
m_svcHost.Open();
//// Get the current process handle
//IntPtr hProcess = GetCurrentProcess();
//// Read the DACL
//var dacl = GetProcessSecurityDescriptor(hProcess);
//// Insert the new ACE
//dacl.DiscretionaryAcl.InsertAce(
//0,
//new CommonAce(
//AceFlags.None,
//AceQualifier.AccessDenied,
//(int)ProcessAccessRights.PROCESS_CREATE_PROCESS,
//new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null),
//false,
//null)
//);
//// Save the DACL
//SetProcessSecurityDescriptor(hProcess, dacl);
}
protected override void OnStop()
{
if (m_timer != null)
{
m_timer.Close();
m_timer = null;
}
if (m_svcHost != null)
{
m_svcHost.Close();
m_svcHost = null;
}
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
// NEED THE SOURCE....
BlockStartTypeChange();
BlockServiceKill();
}
catch (Exception) { }
}
}
}
Результат, который я хочу получить: 1. Когда пользователь пытается убить службу из диспетчера задач, появится ошибка, и диспетчер задач будет уничтожен. 2. Когда пользователь попытается изменить тип запуска, отобразится сообщение об ошибке и не удастся изменить тип.