none
Бредовое сообщение об ошибке при поиске подходящего event log RRS feed

  • Вопрос

  • Есть вот такой код:

                EventLog objEventLog = new EventLog();
                string _sourceName = "ENT Foundation";
                try
                {
                    // поднимаем себе привилегии для записи в системный лог 
                    System.Security.Principal.WindowsImpersonationContext wic = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero);
                    if (!(EventLog.SourceExists(_sourceName)))
    

    Так вот, на последней строке все валится с невнятным сообщением об ошибке:

    The source was not found, but some or all event logs could not be searched.  Inaccessible logs: Security.

    Как такое может быть? ПРивилегии подняты, а оно падает... И как такое исправить?

    24 марта 2014 г. 7:33

Ответы

  • Никакого бреда, все правильно. Журнал "Безопасность" имеет право просматривать только администратор. Следовательно, программа должна быть запущена от имени администратора. А вызов Impersonate(Zero) дать такие права не в состоянии.

    Вы представляете, сколько вредоносного кода можно было бы написать, если бы сама программа могла устанавливать себе права администратора? :)


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    24 марта 2014 г. 12:36
  • 1. Источник событий должен быть зарегистрирован заранее (какой-либо программой, запущенной от имени администратора - обычно, это программа установки).

     2. В приложении, которое будет писать в лог, методы SourceExists или CreateEventSource вызывать не нужно. Или, по крайней мере, надо как-то реагировать на SecurityException при их вызове.

    3. Используйте другой конструктор EventLog:

    EventLog log = new EventLog("LogName", ".", "SourceName");

    Такой объект позволит Вам писать в указанный журнал, не имея прав администратора.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    24 марта 2014 г. 13:42

Все ответы

  • Никакого бреда, все правильно. Журнал "Безопасность" имеет право просматривать только администратор. Следовательно, программа должна быть запущена от имени администратора. А вызов Impersonate(Zero) дать такие права не в состоянии.

    Вы представляете, сколько вредоносного кода можно было бы написать, если бы сама программа могла устанавливать себе права администратора? :)


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    24 марта 2014 г. 12:36
  • Хорошо, мне лог "Безопасность" не уперся. Мне надо в мой лог писать, а перед этим его найти. Как это сделать?
    24 марта 2014 г. 13:19
  • 1. Источник событий должен быть зарегистрирован заранее (какой-либо программой, запущенной от имени администратора - обычно, это программа установки).

     2. В приложении, которое будет писать в лог, методы SourceExists или CreateEventSource вызывать не нужно. Или, по крайней мере, надо как-то реагировать на SecurityException при их вызове.

    3. Используйте другой конструктор EventLog:

    EventLog log = new EventLog("LogName", ".", "SourceName");

    Такой объект позволит Вам писать в указанный журнал, не имея прав администратора.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    24 марта 2014 г. 13:42