Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UAC给我打了一针!_C#_.net 3.5_Uac_Event Log - Fatal编程技术网

C# UAC给我打了一针!

C# UAC给我打了一针!,c#,.net-3.5,uac,event-log,C#,.net 3.5,Uac,Event Log,我目前正在处理的代码在Windows Server 2003上运行,但需要能够写入多台计算机上的事件日志。我用C语言编写代码,使用VS2008 Pro和.NET Framework 3.5 由于框架的存在,代码本身相对简单: using (EventLog remoteEvtLog = new EventLog(LogName, HostName, EventSource)) { remoteEvtLog.WriteEntry(Body); } LogName是一个字符串,包含要写入的

我目前正在处理的代码在Windows Server 2003上运行,但需要能够写入多台计算机上的事件日志。我用C语言编写代码,使用VS2008 Pro和.NET Framework 3.5

由于框架的存在,代码本身相对简单:

using (EventLog remoteEvtLog = new EventLog(LogName, HostName, EventSource))
{
    remoteEvtLog.WriteEntry(Body);
}
LogName是一个字符串,包含要写入的日志的名称—在大多数情况下是应用程序。 主机名是一个字符串,其中包含应写入日志项的计算机的NetBIOS名称。 EventSource是一个包含事件发送者名称的字符串。这是一个由多个应用程序使用的实用程序,因此它通常具有消费应用程序的名称。 Body是一个字符串,包含要写入事件日志的文本

在大多数情况下,这可以正常工作,但当写入的机器使用UAC时,任何创建新EventSource的写入操作都会失败。即使使用的安全凭据是Administrators组的成员,也会发生这种情况,而且我还没有找到指定提升权限级别的方法。显然,Administrators goroup的成员获得两个令牌-一个是有限的,一个是提升的,但据我所知,指定提升的令牌的唯一方法是通过UI-这显然是远程访问日志时的一个问题


有什么想法吗?

您的代码不应该创建新的事件源传统的自动创建行为是不幸的,但仍然是错误的。如果您的应用程序需要一个单独的事件源,那么该应用程序的安装程序(以提升的管理权限运行)应该创建它。

如何从VS Setup Deploy project获得安装程序?这么做?很抱歉,hi jacking。我不认为你可以用VS安装项目来实现这一点-它的功能非常有限。当然,您可以在Orcas中手动编辑生成的MSI,但这非常不方便。一般来说,如果您发现您需要的不仅仅是安装项目提供的功能(这对于任何实际应用程序来说几乎都是确定的),那么您应该切换到WiX。在解决方案资源管理器中,右键单击默认项目:在对话框中选择“添加”>“新建项”,选择安装程序类模板,将其命名为添加的新类-在调用InitializeComponent后,添加以下代码:if!EventLog.SourceExistsMySource EventLog.CreateEventSourceMySource,应用程序;添加安装项目&添加主输出右键单击安装项目,选择查看>自定义操作右键单击安装文件夹,选择添加自定义操作选择应用程序文件夹,然后单击主输出-单击确定。保存和生成-您添加的代码在setup1运行。很抱歉,上次答复中的格式很难阅读。。。2 EventLog.CreateEventSource的用途是什么?如果不是为了创建事件源?在我们的情况下,我们可能正在登录到一个物理主机,该主机上尚未安装应用程序,但正在作为远程应用程序运行:我们希望事件写入客户端,而不是应用程序服务器。我不是在使用自动创建,而是专门测试,如果需要的话,显式地创建EventSource。关键是,从安全角度来看,自动创建事件源与在程序文件下自动创建文件夹是一样的。它不应该由非提升用户完成。