Проблема службы Windows - учетная запись LocalSystem не может прочитать файл - PullRequest
2 голосов
/ 18 сентября 2009

Я создал службу 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

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Если на сервере установлена ​​64-битная ОС, то наиболее вероятной причиной этого является то, что два ваших процесса, IIS и служба обработки журналов, работают с разной битовой скоростью.

На 64-битном компьютере перенаправление файловой системы приводит к тому, что 32-битные процессы, обращающиеся к system32, фактически получают доступ к SysWOW64. Поэтому, если один из ваших процессов работает как 64-битный процесс, а другой как 32-битный процесс, они фактически будут иметь доступ к двум различным расположениям при чтении или записи в system32.

0 голосов
/ 25 сентября 2009

Я разобрался в проблеме. IIS был настроен для входа в базу данных, поэтому файлы, которые я искал, не существовали. К сожалению, у меня нет доступа ни к папке W3SVC1, ни к IIS, поэтому я этого никогда не знал. Я полагаю, когда я задал администратору вопрос «Является ли ex090920.log правильным форматом?», Я должен был спросить, существует ли файл вообще.

Ну, по крайней мере, это решено, и (надеюсь) не нанесет непоправимого урона из-за всех ударов головой.

Спасибо за ваши предложения, Стивен и онгл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...