我目前正在尝试做一些类似于 PSExec 但完全在 Java 中的事情。我认为我的问题与我实际上在做什么没有直接关系,而是如何。目前我正在尝试远程实现服务的创建和启动。
为此,我使用了 midlc 工具(版本 0.6.1)并使用 CreateService 和 DeleteService 调用扩展了 svcctl.idl。之后,我使用 midlc 生成用于 jcifs ( -t jcifs ) 的代码。然后我创建了一个测试程序来使用该类和 jcifs 与远程 Windows 机器进行通信。
这是代码:
rpc.policy_handle scHandle = new rpc.policy_handle();
SvcCtl.OpenSCManager openSCManagerRpc = new SvcCtl.OpenSCManager(host, null, 0x0001 | 0x0002, scHandle);
// Connection-oriented DCE/RPC over SMB named pipes.
DcerpcHandle handle = DcerpcHandle.getHandle("ncacn_np:" + host + "[\\PIPE\\svcctl]",
ConcurrentNtlmAuthenticator.getInstance().getNtlmPasswordAuthentication());
try {
handle.sendrecv(openSCManagerRpc);
if (openSCManagerRpc.retval != 0) {
throw new SmbException(openSCManagerRpc.retval, true);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
handle.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
不幸的是,我得到了 DCERPC_FAULT_PROTO_ERROR 别名 nca_proto_error 别名 0x1c01000b
所以我的简单问题是......我做错了什么?
克里斯