我需要远程创建一个服务,并且不想突破命令并运行“sc emotemachine create ......”并且希望在 C# 代码中执行此操作。

但是,当运行代码时,即使 sc 命令工作得非常顺利,因此正在管理远程系统,但 ManagementScope.Connect 调用会引发异常“RPC 服务器不可用”。

执行此操作的代码片段是

string machineName = "othermachine";
string path = string.Format(@"\\{0}\root\cimv2", machineName);
ManagementScope scope = new ManagementScope(path);
scope.Connect();

因为这是旅程的第一步,我有点不知道下一步该去哪里。sc 命令有效,那么它有什么不同(除了不使用 .net 库 - 也许我需要更努力地使用 winapi?)

谢谢

有帮助吗?

解决方案

在思考了一会儿之后,看到分配给该任务的时间被侵蚀了,我拿出了旧的 WIN32 api 文档,并 [DllImport] 编辑了我需要的调用,以“老式的方式”执行此操作。作为一名老 C 狗,我曾经了解这些调用的方法,令人惊讶的是,即使在使用托管库多年之后,这些调用的返回量也令人惊讶。

我需要做的是能够创建一个服务,启动它,做有用的工作,停止它并删除它。创建、启动、停止和删除都是机制,我想专注于活动的“做有用的工作”部分。

我首先将该服务的 exe 复制到 ADMIN$ 共享并验证了该路径的本地路径(我们的服务器管理员无法得知!)。为此,我致电

["netapi32.dll"]NetShareGetInfo 

然后我将以下内容与 advapi32.dll 一起使用

  • OpenSC管理器
  • 创建服务
  • 启动服务
  • OpenService(当我想停止并删除它时 - 不要保持句柄打开,因为这可能需要一段时间才能保持事物独立)
  • 控制服务
  • 查询服务状态
  • 关闭服务句柄

即使通过 VPN 连接,这一切也能正常工作。

我只能猜测托管 api 正在尝试做的事情远远超出了我实际需要的范围 - 使用托管 api 和 Windows api 所花费的时间差异相当大,并且不能保证托管 api 能够完成它这不是一个合适的前进方向。

其他提示

显然,MSDN 中的股票代码并没有描绘出全貌。我得到和你一样的结果。

看看这个家伙是什么 做过.

编辑:

我相信您是在工作组而不是域上尝试,对吧?这就是窍门,工作组需要更多的工作才能完成。上面的链接似乎有一个解决方法。今晚我会在家再试一次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top