Manoj Prithiani Ответов: 3

Использование собственного кода LogonUser в advapi32.dll дает ошибку unsatisfiedLink


Привет,
Я получаю эту проблему неудовлетворенной ссылки при вызове этой родной функции
Пожалуйста, помогите мне
Ниже приведен мой код
//Test1.java
import com.sun.jna.ptr.*;
class Test1
{
	int LOGON32_LOGON_NETWORK=0;
	int LOGON32_PROVIDER_DEFAULT=0;
	IntByReference lToken=null; 
   static
    {
        System.out.println("Before loading advapi32.dll");
	System.load("C:\\Windows\\system32\\advapi32.dll"); 
        System.out.println("After loading advapi32.dll");
	
    }
    public static void main(String ar[])
    {
        System.out.println("Hello world from Java");
        Test1 t=new Test1();	

t.LogonUser("urms","ICICIBANKLTD","urms",t.LOGON32_LOGON_NETWORK,t.LOGON3

2_PROVIDER_DEFAULT,t.lToken);
        // t.inDll();
	
    }
//   public native void inDll();
     public  native static boolean LogonUser(String sUserName,String 

sDomainName, String sPassword,int LOGON32_LOGON_NETWRK,int 

LOGON32_PROVIDER_DEFAULT,IntByReference lToken);
}

3 Ответов

Рейтинг:
2

Boobalan1976

Привет Маной,

Я также ищу решение JNA для проверки подлинности Windows NT credientials. Когда я выполняю следующую программу, я получаю unsatisfiedLinkerror. Я добавил jna.jar файл в пути к классам windows. У вас есть решение вашей проблемы, если вы, пожалуйста, предоставите мне код. Я использую Apache tomcat и Windows XP server.

import com.sun.jna.Library;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {

//    static {
//    	System.load("C:\\Windows\\system32\\advapi32.dll"); 
//    }
	
	// This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.
    public interface CLibrary extends StdCallLibrary {
    	
       CLibrary INSTANCE = (CLibrary)
	  Native.loadLibrary((Platform.isWindows() ? "advapi32" : "c"),  CLibrary.class);
       public boolean LogonUser(String userName, String domain,String password, int dwLogonType, int dwLogonProvider, IntByReference lToken);
       
    }

    public static void main(String[] args) {
    	IntByReference lToken=null;  	
       CLibrary.INSTANCE.LogonUser("username","domainName","bangalore",0,0,lToken);	
    }
}

Спасибо


Рейтинг:
1

Richard MacCutchan

Глядя на Юна документации[^], Я не вижу прямой ссылки на LogonUser() Я подозреваю, что вам нужно будет использовать альтернативный метод, чтобы получить адрес функции, возможно, W32APIFunctionMapper класс.


Рейтинг:
1

Pete Kelley

Привет-я понимаю, что этому посту около двух лет, но для тех, кто, возможно, смотрит на подобную проблему - у меня была похожая проблема вчера, и ответы через Google, которые я нашел, были довольно тупыми.
Похоже, что в обоих случаях объект IntByReference "lToken" не был инициализирован. Установите его перед звонком ...
lToken = new IntByReference();

После успешного вызова login возвращаемое значение равно "true", и объект lToken будет иметь информацию о токене, для неудачного входа в систему ("false") объект не изменяется.

Для случаев неудачного входа в систему вы должны закодировать JNA / native экземпляр "Kernel32", чтобы вы могли вызвать метод" GetLastError ()". Это связано с тем, что ПВ ООН может быть правильным, но будут и другие причины для неудачи. Один из примеров - "не авторизован на этой машине".
( то есть некоторые из коды от microsoft )