我创建了一个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
答案 0 :(得分:1)
如果服务器运行64位操作系统,那么最可能的原因是您的两个进程IIS和您的日志处理服务以不同的位运行。
在64位机器文件系统上,重定向会导致访问system32的32位进程实际访问SysWOW64。因此,如果您的某个进程作为64位进程运行而另一个进程作为32位进程运行,那么当它们读取或写入system32时,它们实际上将访问两个不同的位置。
答案 1 :(得分:0)
我想出了这个问题。 IIS已配置为记录到数据库,因此我查找的文件不存在。不幸的是,我既没有访问W3SVC1文件夹也没有访问IIS,所以我从来不知道。我想当我向管理员询问“ex090920.log是否为正确的格式?”时,我应该问该文件是否存在。
嗯,至少它已经解决了,因为所有的头部撞击(希望)没有永久性的伤害。
感谢Stephen和ongle的建议。