使用 JNA 与 CoSetProxyBlanket 的 COAUTHIDENTITY
COAUTHIDENTITY with CoSetProxyBlanket using JNA
我正在尝试编写一个 Java API,它使用 JNA 与远程计算机(提供用户名和密码)的 WMI 进行通信。
为此,我想创建 COAUTHIDENTITY
对象并将其与 Java 中的 CoSetProxyBlanket
一起使用。
我尝试移植的代码是 here.
如有任何帮助,我们将不胜感激。
您可以在接口 class 中映射 COAUTHIDENTITY 结构。看起来扩展 WTypes
的 WTypesBase
可能是一个不错的 class 名称,尽管您可以将它放在任何地方。
类型映射很简单:您看到的 unsigned long
可以是 NativeLong
但由于这是 Windows-only 代码,您可以使用 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;
}
(字段顺序映射留作 reader 的练习。)
然后创建它:
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
我正在尝试编写一个 Java API,它使用 JNA 与远程计算机(提供用户名和密码)的 WMI 进行通信。
为此,我想创建 COAUTHIDENTITY
对象并将其与 Java 中的 CoSetProxyBlanket
一起使用。
我尝试移植的代码是 here.
如有任何帮助,我们将不胜感激。
您可以在接口 class 中映射 COAUTHIDENTITY 结构。看起来扩展 WTypes
的 WTypesBase
可能是一个不错的 class 名称,尽管您可以将它放在任何地方。
类型映射很简单:您看到的 unsigned long
可以是 NativeLong
但由于这是 Windows-only 代码,您可以使用 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;
}
(字段顺序映射留作 reader 的练习。)
然后创建它:
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