Problema del servizio Windows: l'account LocalSystem non è in grado di leggere il file

StackOverflow https://stackoverflow.com/questions/1444515

  •  22-07-2019
  •  | 
  •  

Domanda

Ho creato un servizio Windows per aprire il registro IIS, leggere il contenuto, quindi inviarlo via e-mail ai consulenti che "The Man" non vuole avere accesso a tali server. Sul mio computer locale, tutto funziona alla grande e il file generato dall'analisi del registro IIS per il giorno viene inviato per e-mail ai destinatari.

Non ho accesso per installare il mio servizio sul sistema di sviluppo. L'amministratore ha installato il servizio. Il servizio dispone delle autorizzazioni LocalSystem. Quando il servizio viene eseguito, ricevo questo messaggio nel registro dell'applicazione:

LogExtractor: funzione GetIISLog - C: \ WINDOWS \ system32 \ LogFiles \ W3SVC1 \ ex090918.log non esiste.

L'amministratore ha confermato che il percorso è corretto e che il file esiste. (Il mio account utente non ha accesso alla directory W3SVC1.) Ho capito che l'account di sistema è l'account super e può fare praticamente quello che vuole, quindi non riesco a capire perché non può leggere il file. Suppongo che sia un problema di autorizzazioni, poiché i file esistono.

Ecco il codice pertinente. Ho tagliato la logica coinvolta nella sezione sulla lettura del file. Il codice funziona, poiché funziona correttamente su un sistema, ma non su un altro, quindi so che il percorso viene generato correttamente. Qualche idea?

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
È stato utile?

Soluzione 2

Ho capito il problema. IIS era stato configurato per accedere a un database, quindi i file che stavo cercando non esistevano. Sfortunatamente, non ho accesso né alla cartella W3SVC1 né a IIS, quindi non l'ho mai saputo. Suppongo che quando ho posto all'amministratore la domanda "È ex090920.log il formato corretto?", Avrei dovuto chiedere se il file esistesse affatto.

Beh, almeno è risolto, con (si spera) nessun danno permanente a causa di tutti i colpi alla testa.

Grazie per i tuoi suggerimenti Stephen e ongle.

Altri suggerimenti

Se il server esegue un sistema operativo a 64 bit, la ragione più probabile di ciò è che i tuoi due processi, IIS e il tuo servizio di elaborazione dei registri, siano in esecuzione con un diverso testimone.

Su una macchina a 64 bit il reindirizzamento del file system fa sì che i processi a 32 bit che accedono a system32 accedano effettivamente a SysWOW64. Quindi, se uno dei tuoi processi è in esecuzione come processo a 64 bit e l'altro come processo a 32 bit, accederanno effettivamente a due posizioni diverse quando leggeranno o scriveranno su system32.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top