Windows服务问题 - LocalSystem帐户无法读取文件

时间:2009-09-18 13:22:02

标签: .net windows-services

我创建了一个Windows服务来打开IIS日志,阅读内容,然后通过电子邮件将此内容发送给“The Man”不希望对这些服务器具有任何访问权限的顾问。在我的本地计算机上,一切都很好,通过解析当天的IIS日志生成的文件通过电子邮件发送给收件人。

我无权在开发系统上安装我的服务。我让管理员安装了该服务。该服务具有LocalSystem权限。服务运行时,我在应用程序日志中收到此消息:

LogExtractor:GetIISLog函数 - C:\ WINDOWS \ system32 \ LogFiles \ W3SVC1 \ ex090918.log不存在。

管理员已确认路径正确,文件确实存在。 (我的用户帐户无法访问W3SVC1目录。)据我所知,系统帐户是超级帐户,并且可以完成它想要的任务,所以我不知道为什么它无法读取文件。我认为这是一个权限问题,因为文件确实存在。

这是相关代码。我已经剪断了有关读取文件的部分中涉及的逻辑。代码工作,因为它在一个系统上成功运行,而不是另一个系统,所以我知道正确生成了路径。有什么想法吗?

Private Sub GetIISLog(ByVal LastRetrievedDate As DateTime)

    'Build the file path to store the IIS event log before sending it off (previous code snipped)
    Dim FileDate As String = "ex" & Date.Now.Year.ToString.Substring(2, 2) & Month & Day & ".log"
    Dim FileName As String = "C:\WINDOWS\system32\LogFiles\W3SVC1\" & FileDate

    'If the file doesn't exist, exit
    If Not File.Exists(FileName) Then
        LogIssues("LogExtractor: GetIISLog function - " & FileName & " does not exist.", EventLogEntryType.Error)
        Exit Sub
    End If

    Dim s As Stream = Nothing

    Try
        s = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
        Dim strResult As String = String.Empty

        Using sr As New StreamReader(s)
            Using sw As New StreamWriter(IISLogFile, False)

                strResult = sr.ReadLine

                While Not strResult Is Nothing

                    sw.WriteLine(strResult)

                    'Write the results
                    strResult = sr.ReadLine

                End While
            End Using

            sr.Close()
        End Using

        s.Close()
    Catch ex As Exception
        LogIssues("LogExtractor: Error writing IIS file - " & ex.Message, EventLogEntryType.Error)
    Finally
        s.Close()
    End Try

    s = Nothing

End Sub

2 个答案:

答案 0 :(得分:1)

如果服务器运行64位操作系统,那么最可能的原因是您的两个进程IIS和您的日志处理服务以不同的位运行。

在64位机器文件系统上,重定向会导致访问system32的32位进程实际访问SysWOW64。因此,如果您的某个进程作为64位进程运行而另一个进程作为32位进程运行,那么当它们读取或写入system32时,它们实际上将访问两个不同的位置。

答案 1 :(得分:0)

我想出了这个问题。 IIS已配置为记录到数据库,因此我查找的文件不存在。不幸的是,我既没有访问W3SVC1文件夹也没有访问IIS,所以我从来不知道。我想当我向管理员询问“ex090920.log是否为正确的格式?”时,我应该问该文件是否存在。

嗯,至少它已经解决了,因为所有的头部撞击(希望)没有永久性的伤害。

感谢Stephen和ongle的建议。