如何在不使用try catch的情况下验证事件日志写入权限?我已阅读以下问题:Checking Event Log writing Permissions without writing an entry,但答案建议使用EventLogPermissionAttribute
。据我所知,我不能使用它来验证权限,它只是在没有请求的权限时抛出Exception
。
我的代码现在看起来像这样:
public void WriteMessage(string message)
{
try {
var trace = new TraceSource("MySource");
trace.TraceEvent(TraceEventType.Information, 1000, message);
} catch() {
var log = LogManager.GetLogger<MyClass>();
log.Info(message);
}
}
但我想要这样的事情:
public void WriteMessage(string message)
{
if(EventLogPermission("MySource"))
{
var trace = new TraceSource("MySource");
trace.TraceEvent(TraceEventType.Information, 1000, message);
} else {
var log = LogManager.GetLogger<MyClass>();
log.Info(message);
}
}
最后它没有太大的区别,但使用try catch逻辑只是感觉很脏。
答案 0 :(得分:1)
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(
UIntPtr hKey,
string subKey,
int ulOptions,
int samDesired,
out UIntPtr hkResult);
public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
public static int KEY_WRITE = 0x20006;
/// <summary>
/// This method checks write permissions to HKLM\SYSTEM\CurrentControlSet\Services\EventLog which is necessary to create event log source
/// </summary>
/// <returns>True if permission to create Event log source is granted, false if not</returns>
public bool HasCurrentUserEventLogWritePermissions()
{
UIntPtr x;
long err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, @"SYSTEM\CurrentControlSet\Services\EventLog", 0, KEY_WRITE, out x);
return err == 0;
}
答案 1 :(得分:0)
行。我放弃,这只是告诉你失败的尝试。我搜索了一点,反映了一点,答案很令人失望:你不能按照你喜欢的方式做到这一点。
我试图找到一种方法来检查EventLogPermission
(一般的安全权限)而不会出现异常:FAILED。
尝试打开RegKey而不会出现异常:FAILED。
实际上unmanaged APIs实际上可能有用,但我认为如果您的应用程序甚至缺少EventLogPermission
谁会给它SecurityUnmngdCodeAccess
?