【发布时间】:2018-08-19 13:26:59
【问题描述】:
我正在尝试编写一个 Java API,它使用 JNA 与远程机器的 WMI 通信(提供用户名和密码)。
为此,我想创建 COAUTHIDENTITY 对象并将其与 Java 中的 CoSetProxyBlanket 一起使用。
我要移植的代码是here。
对此的任何帮助将不胜感激。
【问题讨论】:
我正在尝试编写一个 Java API,它使用 JNA 与远程机器的 WMI 通信(提供用户名和密码)。
为此,我想创建 COAUTHIDENTITY 对象并将其与 Java 中的 CoSetProxyBlanket 一起使用。
我要移植的代码是here。
对此的任何帮助将不胜感激。
【问题讨论】:
您可以在接口类中映射COAUTHIDENTITY 结构。看起来 WTypesBase 扩展了 WTypes 可能是一个不错的类名,尽管你可以把它放在任何地方。
类型映射很简单:您看到的unsigned long 可以是NativeLong,但由于这是仅限Windows 的代码,您可以使用int,因为我们知道它是32 位的。 unsigned short * 指针是 2 字节(宽)字符的字符数组。只需使用 Pointer 即可。
所以你的结构标题应该是:
class COAUTHIDENTITY extends Structure {
public Pointer User;
public int UserLength;
public Pointer Domain;
public int DomainLength;
public Pointer Password;
public int PasswordLength;
public int Flags;
}
(字段顺序映射留给读者练习。)
然后创建它:
COAUTHIDENTITY auth = new COAUTHIDENTITY();
String user = "username"; // or get from the user
// Allocate memory for user including null terminator
auth.User = new Memory(Native.WCHAR_SIZE * (user.length() + 1));
// Set the widestring in memory
auth.User.setWideString(0, user);
auth.UserLength = user.length();
// Do the same for domain and password
auth.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
// Note: SEC_WINNT_AUTH_IDENTITY_ANSI = 1
【讨论】:
CoSetProxyBlanket API 设置参数pServerPrincName 的值的下一步中面临问题。请参考here 我正在使用的代码 sn-p。我尝试使用 null、空字符串作为该参数的值。该参数的值为COLE_DEFAULT_PRINCIPAL,其类型为 OLECHAR。 @丹尼尔
LPOLESTR 来表示该类型,但从文档中可以看出您可能需要 Windows 常量 COLE_DEFAULT_PRINCIPAL。这将here 定义为指向-1 的指针......我不确定我们是否可以使用LPOLESTR 类型。这可能值得在这里开一个新帖子,或者在 JNA 邮件列表上提出一个问题。您可以尝试为该变量使用Pointer,并手动将其peer 值设置为-1。 (不知道这是否可行,但值得一试!)
Pointer p = new Pointer();Pointer.nativeValue(p, -1);LPOLESTR COLE_DEFAULT_PRINCIPAL = new LPOLESTR(p);,然后在CoSetProxyBlanket调用中使用该常量。我再说一遍,完全未经测试,可能会导致崩溃! :)