Ich habe auch aus der Antwort von @ rocketsarefast herausgefunden, dass Windows die alten Netzwerkanmeldeinformationen löscht, wenn es einen neuen Anmeldeversuch gibt.
Sein net use "\\10.0.0.5\c$" "badpassword" /user:"baduser"
Befehl ist jedoch viel zu langsam, insbesondere wenn der Client einige Sekunden warten muss, bis der Server mit einer Ablehnung reagiert, was schrecklich und unpraktisch ist.
Für meinen Anwendungsfall konnte ich die Win32-API verwenden, um die Netzwerkfreigabe \\Server\Share
dem S:\
Laufwerk zuzuordnen . Es trennt zuerst das Laufwerk und fordert dann den Benutzer mit dem Windows-Netzwerkanmeldedialog auf, damit sich die Person abmelden und als ein anderer Benutzer anmelden kann.
Hier ist der C-Code main.c
:
#ifndef UNICODE
#define UNICODE
#endif
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
#define _WIN32_IE 0x0500
#pragma comment(lib, L"mpr.lib")
#include <windows.h>
//#include <stdio.h>
int wmain(const size_t argc, const wchar_t** argv) {
NETRESOURCE networkResource = {0};
networkResource.dwType = RESOURCETYPE_DISK;
networkResource.lpLocalName = L"S:";
networkResource.lpRemoteName = L"\\\\Server\\Share";
networkResource.lpProvider = NULL;
DWORD result = 0;
result = WNetCancelConnection2(networkResource.lpLocalName, CONNECT_UPDATE_PROFILE, TRUE);
// wprintf(L"WNetCancelConnection2 result: %d\n", result);
result = WNetAddConnection2(&networkResource, NULL, NULL, CONNECT_INTERACTIVE | CONNECT_PROMPT);
// wprintf(L"WNetAddConnection2 result: %d\n", result);
// getchar();
return EXIT_SUCCESS;
}
Hier ist das CMakeLists.txt
:
cmake_minimum_required(VERSION 3.7)
project(MapNetworkDrive)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c11 -g3 -pedantic -Wall -Wextra -O0")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS} -municode -mwindows")
set(SOURCE_FILES main.c)
add_executable(MapNetworkDrive ${SOURCE_FILES})
target_link_libraries(MapNetworkDrive mpr.lib)
Kompilieren Sie mit MinGW-w64 - für 32- und 64-Bit-Windows:
Als Alternative zu C finden Sie hier ein einfaches C # -Tutorial zur API:
net use
, um eine Liste der Verbindungen anzuzeigen, dann eine Verbindung auswählen und das Argument / delete wie von Nate vorgeschlagen hinzufügen.