Как сделать так, чтобы WCF Service никогда не закрывался даже с администраторами? - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно создать сервисную программу, которая никогда не будет закрыта пользователем даже с правами администратора. Это будет не вирусная программа, а просто программа для использования в какой-либо работе. Я должен запретить пользователю изменять тип запуска службы и убивать из диспетчера задач.

Я пытался использовать код, чтобы постоянно изменять тип запуска в реестре службы, но каким-то образом реестр не будет изменяться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. Когда пользователь попытается изменить тип запуска, отобразится сообщение об ошибке и не удастся изменить тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...