【问题标题】:COAUTHIDENTITY with CoSetProxyBlanket using JNA使用 JNA 与 CoSetProxyBlanket 的 COAUTHIDENTITY
【发布时间】:2018-08-19 13:26:59
【问题描述】:

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

【问题讨论】:

    标签: java wmi jna


    【解决方案1】:

    您可以在接口类中映射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。 @丹尼尔
    • 我遇到错误代码 0x80070057,表示我为该 API 提供了错误的值作为参数
    • 您已正确使用 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调用中使用该常量。我再说一遍,完全未经测试,可能会导致崩溃! :)
    • 根据您的建议,我已将其作为单独的澄清 here 提出。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多