Я создал службу Windows, чтобы открыть журнал IIS, прочитать содержимое, а затем отправить это содержимое по электронной почте консультантам, которые «Человек» не хочет иметь никакого доступа к этим серверам. На моей локальной машине все отлично работает, и файл, сгенерированный в результате анализа журнала IIS за день, отправляется получателям по электронной почте.
У меня нет доступа для установки моей службы в системе разработки. У меня был администратор установить службу. Служба имеет разрешения LocalSystem. Когда служба запускается, я получаю это сообщение в журнале приложений:
LogExtractor: функция GetIISLog - C: \ WINDOWS \ system32 \ LogFiles \ W3SVC1 \ ex090918.log не существует.
Администратор подтвердил, что путь правильный и файл существует. (Моя учетная запись пользователя не имеет доступа к каталогу W3SVC1.) Насколько я понимаю, системная учетная запись является учетной записью uber и может выполнять почти все, что ей нужно, поэтому я не знаю, почему она не может читать файл. Я предполагаю, что это проблема с разрешениями, поскольку файлы существуют.
Вот соответствующий код. Я обрезал логику в разделе о чтении файла. Код работает, так как он успешно работает в одной системе, но не в другой, поэтому я знаю, что путь генерируется правильно. Есть идеи?
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