Windows服务无法读取文件,但应用程序可以

时间:2014-01-27 22:03:18

标签: c# windows service

我有一个Windows服务需要每隔90秒左右读取一个文本文件,然后执行一些操作。问题是我得到了拒绝访问权限。从服务中读取文件时出错,但我可以从应用程序中读取文件(使用完全相同的代码)。这是我的第一次服务,所以也许我错过了一些明显的东西?以下是该服务的相关代码(不工作

protected override void OnStart(string[] args)
    {
        this.eventLog1.WriteEntry("my app in OnStart.");
        ThreadPool.QueueUserWorkItem(new WaitCallback(ServiceWorkerThread));
    }
    private void ServiceWorkerThread(object state)
    {
        while (!this.stopping)
        {
            update_DB();
            Thread.Sleep(90000); 
        }
        this.stoppedEvent.Set();
    }
    protected void update_DB()
    {
        try
        { 
            var lines = File.ReadAllLines("C:\\Users\\jkoegler\\Desktop\\text.xml");
            //do a bunch of other stuff
        }
        catch (Exception e)
        {
            this.eventLog1.WriteEntry(e.ToString());
        }
    }

以下是记录的内容:

System.UnauthorizedAccessException: Access to the path
'C:\Users\jkoegler\Desktop\text.xml' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32
rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options,
SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare 
share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare
share, Int32 bufferSize, FileOptions options)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean  
detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(String path, Encoding encoding)
at System.IO.File.InternalReadAllLines(String path, Encoding encoding)

现在我得到的是,我可以在常规Windows窗体应用程序中的按钮单击事件中使用此 EXACT 相同的代码块(update_DB())并且它可以正常工作。我可以在与服务基本相同的时间运行应用程序,它工作得很好。是什么赋予了?我为所有用户提供了对文件和文件夹的完全访问权限。提前致谢

1 个答案:

答案 0 :(得分:1)

Windows服务作为指定用户运行。您可以使用“服务”控制面板查看或更改正在运行的用户。

运行: services.msc 要么 通过控制面板 - >管理工具 - >服务

进行访问

默认情况下,它可能在本地服务帐户下运行,并且该帐户可能没有您尝试阅读的文件的权限,但您的帐户确实。