2012-01-31 30 views
8

Tôi đang gặp sự cố khi cố gắng gọi WNetAddConnection2 cho máy mà tôi đã có phiên. Điều này được mong đợi, vì bạn chỉ có thể kết nối với tài nguyên mạng với chỉ một bộ thông tin đăng nhập. Những gì tôi đang cố gắng làm là bắt tình trạng này và tự động gọi WNetCancelConnection2 để ngắt kết nối tất cả các kết nối hiện có và sau đó thử lại cuộc gọi WNetAddConnection2. Khi tôi chạy mã dưới đây tôi nhận được các thông điệp ghi:WNetAddConnection2 và lỗi 1219 - Tự động ngắt kết nối?

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

Nếu tôi đặt dwFlags để CONNECT_UPDATE_PROFILE trong WNetCancelConnection tôi nhận được các thông điệp ghi:

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

Đây là nguồn của tôi, tất cả help is appreciated!

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); 
} 

Trả lời

2

Vấn đề này vẫn tồn tại hoặc bạn đã giải quyết được chưa?
Tôi đã thất bại tương tự vì tôi đã có các kết nối mở với tài nguyên mà tôi muốn kết nối. Các kết nối này được mở tự động khi khởi động bằng một kịch bản đăng nhập của miền mạng Windows của chúng tôi. Vì vậy, tôi đã sử dụng "sử dụng net" để ngắt kết nối chúng (TẤT CẢ các kết nối đến máy tính đích). Sau đó nó hoạt động tốt.

Điều này có nghĩa đó không phải là lỗi trong mã của bạn, mà là sự cố trong kết nối mạng Windows. BTW: bạn nên sử dụng "sử dụng net" anyway để xem kiểm tra mã của bạn để thành công và không chỉ tin tưởng các thông báo gỡ lỗi.
Và đây là một liên kết đến các mã lỗi: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381%28v=vs.85%29.aspx

0

tôi phải đối mặt với cùng một vấn đề và lý do là:

như nó nói errorCode 1219 có nghĩa là kết nối đã tồn tại đến tài nguyên đó. Bạn có thể hủy kết nối bằng WNetCancelConnection2 (networkName, 0, true) ;, nhưng điều này sẽ không đóng nếu bất kỳ trình khám phá cửa sổ nào có kết nối đến tài nguyên đó. Vì vậy, bạn đảm bảo rằng nếu bất kỳ cửa sổ nào hiển thị nội dung của tài nguyên đó bạn đóng chúng theo cách thủ công và sau đó thử nó sẽ hoạt động. Dù sao bạn luôn có thể sử dụng "lệnh net" để xem có bao nhiêu ánh xạ n/w có trong hệ thống của bạn: sử dụng = dấu nhắc lệnh mở mà chúng gõ: net use Nó sẽ hiển thị cho dù ánh xạ đã có hay không.

Đây là mẫu mã tôi đã viết và nó hoạt động trên chiến thắng 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); 

}

Các vấn đề liên quan