![运行 Windows 服务和通过 shell 运行有什么区别?](https://linux22.com/image/595100/%E8%BF%90%E8%A1%8C%20Windows%20%E6%9C%8D%E5%8A%A1%E5%92%8C%E9%80%9A%E8%BF%87%20shell%20%E8%BF%90%E8%A1%8C%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我正在尝试解决 Windows 2008 服务器中的一个问题,当尝试连接到“Timberline 数据源”ODBC 驱动程序时,如果调用处于“服务”上下文中,则会发生崩溃,但如果在远程桌面会话中手动发起调用,则会成功。
我已将该服务设置为以我的用户身份运行。
我想知道,在其他所有条件相同的情况下(用户、机器等),将进程作为服务运行与手动运行之间是否存在根本的安全/环境差异?
--- 实施细节 ---
如果它对任何人都有帮助,我有一个系统,它开始尝试使用 ODBC 和通过 IIS 7 调用的 Python CGI 脚本连接到 Timberline 数据库。脚本本身运行良好,但是,一旦我尝试执行 ODBC 连接功能,脚本就会崩溃而不会引发异常。通过命令行执行时,脚本能够正常连接。
当使用 C#/.net 服务,尝试通过 Apache、Windows Scheduler 甚至第三方调度工具运行时,也会发生同样的事情。
使用最后一个选项(第三方调度工具 pycron),服务配置为以我的域用户身份登录并遇到了同样的问题(我通过任务管理器确认运行该进程的用户实际上是我)。
此外,如果它很重要,则将 Timberline DSN 配置为通过 UNC(“\\timberline-server\Timberline Office\Accounts\AT”或类似的内容)定位数据库
DSN 设置在“系统 DSN”级别根据 ODBC 管理工具,这意味着 DSN 可供用户和服务使用
我还意识到,正如 Joel 指出的那样,服务器确实有一个映射驱动器(“Y:”映射到“\\timberline-server\Timberline Office”)
答案1
看起来数据库在共享上。默认情况下,服务在网络帐户上的系统下运行,很可能无权访问数据库所在的共享。当您在您的帐户下运行它时,脚本可以访问数据库,因为您可以访问 Windows 共享。
答案2
您需要将服务设置为使用服务帐户运行(即为此目的创建一个名为 YOURDOMAIN\svc_timberline 的用户),然后授予该服务帐户对包含数据库的文件夹的权限。
此后它应该可以工作。
答案3
正如一些用户提到的,映射驱动器只能通过交互式登录会话来设置,即在后台服务中不可用。经过研究,我意识到,虽然我的 DSN 通过 UNC 引用网络位置,但实际的 ODBC 连接器被设计用来引用映射驱动器。
由于在这种情况下我无法更改驱动程序配置,因此我能够更新我的服务以动态映射驱动器。 因此,当我的 Python 脚本被调用时,它会在调用 ODBC 连接之前映射驱动器,从而解决崩溃问题。
如果有人遇到类似的问题,我用过这些 Python 函数在我的脚本中映射驱动器。
谢谢大家的帮助!