gpt4 book ai didi

c# - 不带 "run as administrator"的导出事件日志 (.evtx)

转载 作者:行者123 更新时间:2023-11-30 23:17:58 25 4
gpt4 key购买 nike

问题是否可以在非“以管理员身份运行”的进程中导出事件日志?

我正在遵循 https://msdn.microsoft.com/en-us/library/bb671203(v=vs.90).aspx 中的示例代码

using (var els = new EventLogSession())
{
els.ExportLogAndMessages("Security", PathType.LogName, "*", @"c:\temp\security.evtx");
}

此代码在我使用“以管理员身份运行”运行进程时成功运行,但在未“以管理员身份运行但出现异常”时失败

System.UnauthorizedAccessException: "Attempted to perform an unauthorized operation."

使用类似的代码访问我的应用程序的事件日志

using (var els = new EventLogSession())
{
els.ExportLogAndMessages("MyAppLog", PathType.LogName, "*", @"c:\temp\myapplog.evtx");
}

我得到类似的结果,除了异常不同:

System.Diagnostics.Eventing.Reader.EventLogException: "The directory name is invalid"

我是不是做错了什么,或者是否有不同的方法可以让我在不需要管理员权限的情况下将事件日志导出到 .evtx 文件?

注意事项:

最佳答案

Question: Is it possible to export an event log in a process not "run as administrator"?

可以,但前提是您有权访问要导出的事件日志。

但是,您的问题似乎更像是

Why can't I export my application's event log using EventLogSession? An EventLogException is thrown with the message "The directory name is invalid".

查看 EventLogSession 的源代码你可以看到对 ExportLogAndMessages 的调用将调用 native 函数 EvtExportLog .如果此函数失败,则通过调用 GetLastError 检索错误代码。这个 native Windows 错误代码是 mapped to one of several exceptions .

如果发生以下任何错误,将抛出您遇到的异常:

  • ERROR_FILE_NOT_FOUND (2): 系统找不到指定的文件。
  • ERROR_PATH_NOT_FOUND (3): 系统找不到指定的路径。
  • ERROR_EVT_CHANNEL_NOT_FOUND (15007):找不到指定的 channel 。检查 channel 配置。
  • ERROR_EVT_MESSAGE_NOT_FOUND (15027):消息资源存在,但在字符串/消息表中找不到消息。
  • ERROR_EVT_MESSAGE_ID_NOT_FOUND (15028):找不到所需消息的消息 ID。
  • ERROR_EVT_PUBLISHER_METADATA_NOT_FOUND (15002):无法在资源中找到发布者元数据。

如果您指定了错误的事件日志名称,那么 ERROR_EVT_CHANNEL_NOT_FOUND 就是您遇到的错误。我猜这是你的问题。

但是,您可以自己调用 EvtExportLog 并检查 native 错误代码以更好地理解调用失败的原因:

[DllImport("kernel32.dll")]
static extern uint GetLastError();

[DllImport("wevtapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EvtExportLog(IntPtr session, string channelPath, string query, string targetFilePath, int flags);

var success = EvtExportLog(IntPtr.Zero, "MyAppLog", "*", @"c:\temp\myapplog.evtx", 1);
if (!success)
{
var error = GetLastError();
Console.WriteLine(error);
}

native 错误代码应该清楚地指示潜在问题是什么。

关于c# - 不带 "run as administrator"的导出事件日志 (.evtx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41134054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com