2017-09-13 67 views
0

Java를 통해 'net use'명령을 사용하여 네트워크 드라이브를 매핑하려고합니다.Java를 사용하는 매핑 된 네트워크 드라이브가 연결되지 않았습니다.

나는 그물에 보인 몇몇 접근을 시도했다 그러나 아무도 우리의 UAT PC에 작동하는 것처럼 보이지 않으며 항상 나의 PC에 작동한다.

UAT의 PC - Windows Server 2008 R2의 표준 서비스 팩 1 내 PC - 윈도우 7 프로 서비스 팩 어떻게됩니까 1

는 방법은 새 드라이브하지만 드라이브 아이콘이 X 표시가 뭔가 나타내는했습니다 생성입니다 잘못되었습니다. 클릭하면 다음과 같이 말합니다. "위치를 사용할 수 없습니다."[메시지 제목] L :에 액세스 할 수 없습니다. 로그온 실패 : 알 수없는 사용자 이름 또는 암호가 잘못되었습니다.

다음은 지금까지 시도했지만 동일한 결과를 산출 한 코드입니다. 나는 (시도 1) 명령 줄에서 실제 명령을 실행하거나 내가 (시도 4에서) 자체를 배치 파일을 실행하면

public void connectToRemoteServer() 
{ 
    try 
    { 
    String USER_NAME = "domain\\username"; 
    String PASSWORD = "password"; 
    /** ATTEMPT 1 - Call command from JAVA using string - OK in LOCAL, FAILED in UAT */ 
    // String commandInside = "net use " + REMOTE_FILE_SERVER_DRIVE + ": \\\\ipaddress\\folder /user:" + USER_NAME + " " + PASSWORD; 
    // Process p = Runtime.getRuntime().exec(commandInside); 
    // Log.info("Executing command [" + commandInside + "]"); 
    // p.waitFor(); 

    /** ATTEMPT 2 - Call command from JAVA using an array of string - OK in LOCAL, FAILED in UAT */ 
    // String[] commandInside = {"c:\\windows\\system32\\net.exe", "use", REMOTE_FILE_SERVER_DRIVE + ":", "\\\\ipaddress\\folder", "/user:" + USER_NAME, PASSWORD }; 
    // Process p = Runtime.getRuntime().exec(commandInside); 
    // Log.info("Executing command [" + commandInside + "]"); 
    // p.waitFor(); 

    /** ATTEMPT 3 - Call command from JAVA using a process builder - OK in LOCAL, FAILED in UAT */ 
    // String[] commandInside = { "cmd.exe", "/C", "net", "use", REMOTE_FILE_SERVER_DRIVE + ":", "\\\\ipaddress\\folder", "/user:" + USER_NAME, PASSWORD }; 
    // Log.info("Constructed command [" + Arrays.toString(commandInside) + "]"); 
    // ProcessBuilder pb = new ProcessBuilder(commandInside); 
    // Log.info("Starting command"); 
    // Process process = pb.start(); 
    // Log.info("Waiting for command to complete"); 
    // process.waitFor(); 

    /** ATTEMPT 4 - Write the command in a cmd/bat file then execute that cmd/bat file from JAVA using an array of string - OK in LOCAL, FAILED in UAT*/ 
    File batchFile = new File(ROOT_PATH + "MapRemoteServer.cmd"); 

    String commandInside = "net use " + REMOTE_FILE_SERVER_DRIVE + ": \\\\ipaddress\\folder/user:" + USER_NAME + " " + PASSWORD; 
    batchFile.createNewFile(); 
    FileWriter fw = new FileWriter(batchFile); 
    fw.write(commandInside + "\r\n\r\nexit"); 
    fw.close(); 

    Thread.sleep(500); // just to ensure that the file is properly closed before running it 
    String[] command = { "cmd.exe", "/c", "Start", ROOT_PATH + "MapRemoteServer.cmd" }; 

    Process process = Runtime.getRuntime().exec(command); 
    process.waitFor(); 


    int exitStatus = process.exitValue(); 
    Log.info("Exit status: [" + exitStatus + "]"); 

    if (exitStatus != 0 && exitStatus != 2) 
    { 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
     String messageLine = null; 
     Log.info("Error/Warning encountered during execution of net use!"); 
     while ((messageLine = stdError.readLine()) != null) { 
     if (messageLine.length() > 0) 
     { 
      Log.info(messageLine); 
     } 
     } 
    } 
    else if (exitStatus == 2) 
    { 
     Log.info("Connection already established!"); 
    } 
    else 
    { 
     Log.info("Connection successful!"); 
    } 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 

, 그것을 작동합니다. 내 Java 코드에 의해 실행될 때만 그렇습니다.

넷 사용 이외에도 Java를 통해 Windows에서 드라이브를 매핑하는 다른 방법이 있습니까? Windows PC에서 프로그램에서 매핑을 방지 할 수있는 일종의 설정이 있습니까?

+1

드라이브 매핑에는 관리자 액세스 권한이 필요합니다. 높은 보안으로 명령을 실행해야합니다. 방법은 Google ['java as administrator' (https://www.google.com/search?q=java+run+as+administrator)]를 참조하십시오. – Andreas

+0

드라이브를 매핑하는 데 사용하는 ID는 이미'(/ user : "+ USER_NAME +" "+ PASSWORD) '액세스 권한이 있습니다. 또한 일괄 스크립트를 실행하려면 관리자 ID를 사용해야하며? – leahsaif

+0

그것은 네트워크 공유에 액세스하는 데 사용되는 ID입니다. 그러나 드라이브 문자를 매핑하는 데 로컬 관리자 권한이 필요합니다. OS 설정 변경 때문이며 Windows UAC가 활성화되어있는 경우 권한 상승이 필요한 이유입니다. – Andreas

답변

0

나중에 참조 할 수 있도록 답변을 게시하십시오. net use 명령을 문자없이 실행하면 작동합니다. 드라이브 문자는 만들지 않지만 전체 경로 (ipaddress \ folder)를 입력하면 액세스 할 수 있습니다. 내가 사용하는 명령 문자열은

net use " + "\\\\ipaddress\\folder /user:" + USER_NAME + " " + PASSWORD 

... 트릭을했습니다! 내 ID는 전체 액세스 권한을 가지고 있습니다.

연결되어 있는지 여부를 확인하려면 폴더가 존재하는지 확인해야합니다. if (!myDirectory.exists()).