2012-01-31 10 views
8

मैं एक समस्या में भाग रहा हूं जब मैं WNetAddConnection2 को उस मशीन पर कॉल करने का प्रयास करता हूं जिसमें मेरे पास पहले से सत्र है। इसकी अपेक्षा की जाती है, क्योंकि आप केवल एक संसाधन संसाधन से कनेक्ट कर सकते हैं जिसमें केवल एक सेट प्रमाण-पत्र हैं। जो मैं करने की कोशिश कर रहा हूं वह इस स्थिति को पकड़ लेता है और सभी मौजूदा कनेक्शन डिस्कनेक्ट करने के लिए स्वचालित रूप से WNetCancelConnection2 को कॉल करता है और फिर WNetAddConnection2 कॉल को पुनः प्रयास करता है। जब मैं नीचे दिए गए कोड को चलाने मैं इन लॉग संदेश प्राप्त:WNetAddConnection2 और त्रुटि 1219 - स्वचालित रूप से डिस्कनेक्ट करें?

DEBUG - WNetAddConnection2 returned 1219 
DEBUG - Multiple credentials detected, disconnecting all current sessions 
DEBUG - WNetCancelConnection2 returned 0 
DEBUG - WNetAddConnection2 returned 1219 

अगर मैं WNetCancelConnection में CONNECT_UPDATE_PROFILE को dwFlags सेट मैं इन लॉग संदेश प्राप्त:

DEBUG - WNetAddConnection2 returned 1219 
DEBUG - Multiple credentials detected, disconnecting all current sessions 
DEBUG - WNetCancelConnection2 returned 2250 
DEBUG - WNetAddConnection2 returned 1219 

यहाँ मेरी स्रोत है, सभी मदद की सराहना की है!

networkName = @"\\192.168.1.1"; 
var netResource = new NetResource() 
{ 
    Scope = ResourceScope.GlobalNetwork, 
    ResourceType = ResourceType.Disk, 
    DisplayType = ResourceDisplaytype.Share, 
    RemoteName = networkName 
}; 

int result = WNetAddConnection2(netResource, credentials.Password, credentials.UserName, 0); 

log.Debug("WNetAddConnection2 returned " + result); 

if (result == 1219) 
{ 
    log.Debug("Multiple credentials detected, disconnecting all current sessions"); 

    result = WNetCancelConnection2(networkName, 0, true); 
    log.Debug("WNetCancelConnection2 returned " + result); 

    result = WNetAddConnection2(netResource, credentials.Password, credentials.UserName, 0); 
    log.Debug("WNetAddConnection2 returned " + result); 
} 

उत्तर

2

क्या यह समस्या अभी भी मौजूद है या आपने इसे हल किया है?
मुझे एक ही विफलता थी क्योंकि मेरे पास उस संसाधन के लिए खुले कनेक्शन थे जिन्हें मैं कनेक्ट करना चाहता था। ये कनेक्शन स्वचालित रूप से हमारे विंडोज नेटवर्क डोमेन की लॉगऑन स्क्रिप्ट द्वारा स्टार्टअप पर खोले गए थे। तो मैंने उन्हें डिस्कनेक्ट करने के लिए "शुद्ध उपयोग" का उपयोग किया (लक्ष्य कंप्यूटर से सभी कनेक्शन)। उसके बाद यह अच्छी तरह से काम किया।

इसका मतलब है कि यह आपके कोड में विफलता नहीं है, लेकिन विंडोज नेटवर्किंग में एक समस्या है। बीटीडब्लू: आपको सफलता के लिए अपना कोड देखने के लिए वैसे भी "शुद्ध उपयोग" का उपयोग करना चाहिए और न केवल डीबग संदेशों पर भरोसा करना चाहिए।
और यहाँ त्रुटि कोड के लिए एक लिंक है: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381%28v=vs.85%29.aspx

0

मैं एक ही समस्या का सामना करना पड़ा और कारण था:

के रूप में यह कहते हैं errorCode 1219 का मतलब है कि कनेक्शन संसाधन के लिए मौजूद हैं पहले से ही कर रहे हैं। आप WNetCancelConnection2 (networkName, 0, true) का उपयोग करके कनेक्शन रद्द कर सकते हैं, लेकिन यदि कोई विंडोज एक्सप्लोरर उस संसाधन से कनेक्शन कर रहा है तो यह बंद नहीं होगा। तो आप सुनिश्चित करते हैं कि कोई भी विंडो उस संसाधन की सामग्री को दिखाती है जिसे आप मैन्युअल रूप से बंद करते हैं और फिर कोशिश करें कि यह काम करेगा। वैसे भी आप हमेशा "नेट कमांड" का उपयोग कर सकते हैं यह देखने के लिए कि आपके सिस्टम में कितने एन/डब्ल्यू मैपिंग हैं: उपयोग = ओपन कमांड प्रॉम्प्ट वे टाइप करते हैं: शुद्ध उपयोग यह दिखाएगा कि मैपिंग पहले से मौजूद है या नहीं।

यह नमूना कोड मैंने लिखा है और यह जीत 8 पर काम करता है:

#include "stdafx.h" 
#ifndef UNICODE 
#define UNICODE 
#endif 
#pragma comment(lib, "mpr.lib") 

#include <windows.h> 
#include <tchar.h> 
#include <stdio.h> 
#include <Winnetwk.h> 
#include<iostream> 
#include<string> 

// Need to link with Netapi32.lib and Mpr.lib 
int _tmain(int argc, _TCHAR* argv[]){ 
DWORD dwRetVal;  
NETRESOURCE nr; 
DWORD dwFlags; 
DWORD cancelRetVal; 

// Zero out the NETRESOURCE struct 
memset(&nr, 0, sizeof(NETRESOURCE)); 

// Assign our values to the NETRESOURCE structure. 
nr.dwType = RESOURCETYPE_ANY; 

nr.dwScope = RESOURCE_GLOBALNET; 
nr.lpLocalName =NULL; 

nr.lpRemoteName = L"\\\\x.x.x.x\\folder"; 

nr.lpProvider = NULL; 

// Assign a value to the connection options 
dwFlags = CONNECT_UPDATE_PROFILE; 

cancelRetVal = WNetCancelConnection2(L"\\\\x.x.x.x\\fodler", 0, true); 

//usage WNetAddConnection2("location", L"password", L"domain\\username", 0); 
dwRetVal = WNetAddConnection2(&nr, L"password", L"domain\\username", 0); 

if (dwRetVal == NO_ERROR) 
    wprintf(L"Connection added to %s\n", nr.lpRemoteName); 
else 
    wprintf(L"WNetAddConnection2 failed with error: %u\n", dwRetVal); 

std::string s; 
std::getline(std::cin, s); 
exit(1); 

}

संबंधित मुद्दे