在Windows窗体应用程序中工作但不在Windows服务中工作的代码是否有任何错误?

时间:2015-03-18 11:23:40

标签: c# .net windows-services

这里的代码是

protected override void OnStart(string[] args)
    {
        Thread thr = new Thread(new ThreadStart(run));
        thr.Start();
    }
    static void run()
    {


        while (true)
        {
            StreamWriter str = new StreamWriter("D:\\Sarojini.txt", true);
            str.WriteLine();
            str.WriteLine("**** List of Apllication*********");
            str.WriteLine();
            str.WriteLine("Service started on:" + DateTime.Now.ToString());
            string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
            str.WriteLine();
            str.WriteLine("the current user is  " + userName);
            Process[] processlist = Process.GetProcesses();

            foreach (Process process in processlist)
            {
                if (!String.IsNullOrEmpty(process.MainWindowTitle))
                {
                    str.WriteLine("Process::{0}   ID::{1}   Title::{2}", process.ProcessName, process.Id, process.MainWindowTitle);

                }
            }
            str.Close();
            Thread.Sleep(3600000 / 10);
        }

    }

    protected override void OnStop()
    {
        StreamWriter str = new StreamWriter("D:\\Sarojini.txt", true);
        str.WriteLine();
        str.WriteLine("the service has been stopped.");


    }

这里在这段代码中,创建了一个文本文件并在其上写了第一行,但是正在运行的应用程序列表不在那里,当我在windowsFormApllication中使用此代码时,它运行得很好。我不知道是什么问题。

1 个答案:

答案 0 :(得分:1)

这很可能是由于您运行服务的帐户没有使用Process类的正确权限。在尝试检索您的应用程序需要具有足够权限的进程名称,ID等时,默认本地系统帐户不太可能满足此要求。

当您将此代码作为Windows窗体应用程序WindowsIdentity.GetCurrent()运行时,将返回当前登录的用户。

当您将此代码作为Windows服务运行时WindowsIdentity.GetCurrent()将返回在服务设置中的用户帐户下设置的用户。

这将显示它们使用不同的凭据运行。因此,您的服务可能在无权执行所需操作的帐户下运行。

要检查一下:

  • 进入服务,然后双击您的服务。

  • 点击登录标签

  • 默认选中本地系统帐户,但您要选择此帐户并设置有效帐户。