Pergunta

Eu criei um serviço do Windows para abrir o IIS log, o conteúdo de leitura, em seguida, e-mail este conteúdo aos consultores que 'The Man' não querem ter qualquer acesso a esses servidores. Na minha máquina local, tudo funciona muito bem, e o arquivo gerado a partir de analisar o log IIS para o dia é para os destinatários por e-mail.

Eu não tenho acesso para instalar o meu serviço no sistema de desenvolvimento. Eu tive o administrador instalar o serviço. O serviço tem permissões LocalSystem. Quando o serviço é executado, recebo esta mensagem no registo de aplicações:

LogExtractor: função GetIISLog - C:. \ WINDOWS \ system32 \ LogFiles \ W3SVC1 \ ex090918.log não existe

O administrador confirmou que o caminho está correto e o arquivo existe. (Minha conta de usuário não tem acesso ao diretório W3SVC1.) Foi o meu entendimento de que a conta do sistema é a conta-uber, e pode fazer praticamente o que quer, então eu estou em uma perda a respeito de porque ele não pode ler o arquivo. Eu estou assumindo que é um problema de permissões, já que os arquivos não existe.

Aqui está o código relevante. Eu já cortou a lógica envolvida na seção sobre a leitura do arquivo. O código funciona, como ele é executado com sucesso em um sistema, mas não outro, então eu sei o caminho está sendo gerado corretamente. Alguma idéia?

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
Foi útil?

Solução 2

Eu descobri o problema. IIS foi configurado para log para um banco de dados, para que os arquivos que eu estava procurando não existe. Infelizmente, não tenho acesso a nem a pasta W3SVC1 nem para o IIS, então eu nunca soube disso. Acho que quando eu perguntei o administrador a pergunta "É ex090920.log o formato corrrect?", Eu deveria ter perguntado se o arquivo existido.

Bem, pelo menos ele está resolvido, com (espero) nenhum dano permanente por causa de todo o bater a cabeça.

Obrigado por suas sugestões Stephen e ongle.

Outras dicas

Se o servidor está executando um sistema operacional de 64 bits, em seguida, a razão mais provável para isso é que os dois processos, o IIS e seu serviço de processamento de log, estão funcionando com bitness diferente.

Em um redirecionamento de sistema de arquivo de máquina de 64 bits faz com que 32 processos bit que acessam system32 para realmente acesso SysWOW64. Então, se um de seus processos está sendo executado como um processo de 64 bits e o outro como um processo de 32 bits, vão estar acessando dois locais diferentes quando ler ou escrever para system32.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top