我已经创建了一个Windows服务来打开IIS日志,阅读内容,然后通过电子邮件将此内容发送给顾问,告诉他们'The Man‘不想访问这些服务器。在我的本地机器上,一切工作正常,解析当天的IIS日志生成的文件将通过电子邮件发送给收件人。
我没有权限在开发系统上安装我的服务。我让管理员安装了该服务。该服务具有LocalSystem权限。当服务运行时,我在应用程序日志中收到以下消息:
C:\WINDOWS\system32\LogFiles\W3SVC1\ex090918.log :LogExtractor函数- GetIISLog不存在。
管理员已确认路径正确,并且该文件确实存在。(我的用户帐户没有访问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发布于 2009-09-25 19:46:04
我发现了问题所在。IIS已配置为记录到数据库,因此我要查找的文件不存在。不幸的是,我既不能访问W3SVC1文件夹,也不能访问IIS,所以我从来不知道这一点。我想当我问管理员这个问题"Is ex090920.log the corrrect format?“时,我应该问这个文件是否存在。
好吧,至少它已经解决了,(希望)不会因为所有的头部撞击而造成永久性的损害。
谢谢你的建议,Stephen和ongle。
发布于 2009-09-18 15:28:57
如果服务器运行的是64位操作系统,则最可能的原因是您的两个进程IIS和日志处理服务正在以不同的位数运行。
在64位机器上,文件系统重定向导致访问system32的32位进程实际访问SysWOW64。因此,如果您的一个进程作为64位进程运行,另一个作为32位进程运行,那么当它们读取或写入system32时,实际上将访问两个不同的位置。
https://stackoverflow.com/questions/1444515
复制相似问题