【问题标题】:Windows services permission problemsWindows 服务权限问题
【发布时间】:2011-10-16 08:33:29
【问题描述】:

我编写了一个使用 openpop 邮件客户端和检索电子邮件的 Windows 服务。然后它通过主题和正文更新数据库和各种东西。它还下载附件并根据电子邮件的时间戳在驱动器上创建一个文件夹目录,然后按年、月、日,然后保存图像。因此,我在开发中使用类库项目、用于调试的 winform 项目和 Windows 服务项目在我的机器上构建了此服务。 所有逻辑都包含在一个类库中。我构建了库并在表单和 Windows 服务中引用了 dll。当我在我的机器上构建服务并使用 installutil 安装它时,它可以正常工作,并且可以完成它应该做的事情。但是当我投入生产时,操作系统是 Windows Server 2003 R2,它为 LIVE 数据库使用了不同的连接字符串。

唯一改变的是连接字符串和操作系统。我安装了该服务,它安装得很好,但什么也没做。它不会创建文件夹或将图像保存到磁盘。我知道我应该记录错误,但这是我的第一份工作,我是这个领域的新手。所以我尝试编写一些日志记录事件,但它不会创建日志并写入事件。事实上,如果我尝试创建日志并写入事件,作为我在 onstart 子中的第一次调用,它不会这样做。现在我迷路了,我不知道从这里去哪里。如果您花时间阅读本文,感谢您提供的任何意见。

这是我的 OnStart 方法中的代码。

    Dim LiveEvents As New EventLog
    If Not EventLog.SourceExists("MySource") Then
        EventLog.CreateEventSource("MySource", "GL")
    End If
    LiveEvents.Source = "MySource"
    LiveEvents.Log = "GL"
    LiveEvents.WriteEntry("ServiceStarted and is working.", EventLogEntryType.Information)
    Dim Logic As New ProcessMail
    workTimer = New Timer(New TimerCallback(AddressOf Logic.ProcessMessages), Nothing, (1000 * 60 * 10), (1000 * 60 * 10))
    LiveEvents.WriteEntry("Called Our DLL", EventLogEntryType.Information)
    MyBase.OnStart(args)

所以,如果你不知道这里的问题。 1. 如果我需要在 Windows Server 2003 R2 中使用 Windows 服务创建目录和保存文件。我应该使用什么 System System.ServiceProcess.ServiceInstaller Account 属性? 2. 我需要在 windows server 2003 R2 中进行任何特殊的设置过程,以允许我安装的服务有权对目录进行读写访问吗?

感谢您提供的任何信息和帮助。

【问题讨论】:

  • 服务以谁的身份运行?本地系统或特定帐户?您要创建哪些文件夹?您需要返回并添加一些检测工具,以便捕捉正在发生的错误并找出它在抱怨什么。
  • 该服务应该以管理员身份运行,它在我设置的 c:/images 文件夹中动态创建文件夹。顺便说一句,如果本地系统最强大,我为每个帐户属性创建了 4 个构建,那么我将使用它
  • 在 SCM 中为您的服务配置了什么帐户?
  • 生产服务器上的 SCM Windows server 2003 ?
  • @Joe 它为本地系统配置,我正在使用本地系统。它只是没有单步执行代码,我的调试项目和生产之间存在脱节,我无法弄清楚它是什么

标签: vb.net windows-services windows-server-2003


【解决方案1】:

您选择的帐户需要对目录具有足够的权限。只要您对文件夹设置了正确的权限,该帐户就没有什么特别之处。最简单的故障排除方法是从一个强大的帐户开始(例如本地系统,您可以通过“登录”选项卡下的服务属性小程序随意更改帐户,只需停止并重新启动服务,看看帐户更改是否有任何影响)。您还可以允许“每个人”拥有对该文件夹的完全访问权限,看看帽子是否有任何影响。请记住,在诊断问题后,只保留必要且尽可能少的权力和权限。

另外,您的问题可能出在其他地方。您应该检查事件查看器是否有任何错误。您可以使用 sysinternals 中的一些工具来帮助您找到问题 (http://technet.microsoft.com/en-us/sysinternals/bb545027)。运行服务的帐户需要有足够的权限才能写入事件日志。因此,这是尝试以特权用户身份运行该服务以查看它是否会开始写入日志的另一个原因。当然,正如您提到的,添加更多日志记录也是一个不错的选择。

确保服务安装没有错误并在服务小程序中显示为正在运行。

【讨论】:

  • 是的,它的安装没有任何错误,至少没有在 installutil 和事件应用程序日志中报告它只是说服务已启动。我猜是本地系统,不知何故在我创建的 c://image 文件夹中(将在其中创建文件夹)我必须给它某种权限,虽然我不知道该怎么做
  • 即使在本地系统下,它仍然没有创建日志并写入事件。即使这是服务做的第一件事
  • 你能从你的服务中提供一些代码吗? OnStartEvent 中执行了什么以及如何创建日志以及如何写入日志?
  • 我在问题中添加了一些代码,它只是在我的类库中调用了一个事件日志和一个方法
  • 我查看了示例代码,其中有一个可能会导致问题。对 EventLog.SourceExists("MySource") 的调用。根据本文,您的代码可能会引发安全异常:msdn.microsoft.com/en-us/library/6s7642se.aspx。此外,根据那篇文章,您最好在安装程序与 OnStart 事件中创建该日志。因此,如果您决定在 OnStart 中继续调用 SourceExists("MySource")(并假设它在您第一次运行时会失败),请在安装程序中创建事件源或以管理员角色的用户身份运行服务.
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2018-08-09
  • 2011-01-19
  • 2012-06-14
相关资源
最近更新 更多