使用 JNA 与 CoSetProxyBlanket 的 COAUTHIDENTITY

COAUTHIDENTITY with CoSetProxyBlanket using JNA

我正在尝试编写一个 Java API,它使用 JNA 与远程计算机(提供用户名和密码)的 WMI 进行通信。
为此,我想创建 COAUTHIDENTITY 对象并将其与 Java 中的 CoSetProxyBlanket 一起使用。
我尝试移植的代码是 here.
如有任何帮助,我们将不胜感激。

您可以在接口 class 中映射 COAUTHIDENTITY 结构。看起来扩展 WTypesWTypesBase 可能是一个不错的 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