Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

GetDriveType gibt 4 aus trotz keiner Verbindung

Sovebämse / 10 Antworten / Baumansicht Nickles

Hallo zusammen

Ich möchte in einem Programm (C++) abfragen, ob ein Netzlaufwerk verbunden ist. Dies habe ich über GetDriveType realisiert. Leider ist es so, dass dieser Befehl sporadisch aber häufig trotz keiner bestehenden Verbindung (selbst nach Neustart) eine 4 ausgibt statt einer 1. Was kann der Grund sein?

Vielen Dank
Thomas

bei Antwort benachrichtigen
Borlander Sovebämse „GetDriveType gibt 4 aus trotz keiner Verbindung“
Optionen

Du fragst hier nun aber nicht ab ob eine Verbindung besteht, sondern ob es sich um ein Netzlaufwerk handelt. Und das existiert auch ohne eine aktive Verbindung.

bei Antwort benachrichtigen
Sovebämse Borlander „Du fragst hier nun aber nicht ab ob eine Verbindung besteht, sondern ob es sich um ein Netzlaufwerk handelt. Und das ...“
Optionen

Ja, aber wenn doch das Netzlaufwerk (Laufwerksbuchstabe) getrennt ist, sollte es doch auch nicht als Netzlaufwerk erkannt werden, weil es dieses überhaupt nicht gibt.

bei Antwort benachrichtigen
Borlander Sovebämse „Ja, aber wenn doch das Netzlaufwerk Laufwerksbuchstabe getrennt ist, sollte es doch auch nicht als Netzlaufwerk erkannt ...“
Optionen

Solange ein Buchstabe zugewiesen ist gibt es ein Laufwerk. Wenn Du das Medium aus Deinem DVD-Laufwerk nimmst, dann ändert sich der Typ doch auch nicht.

bei Antwort benachrichtigen
Sovebämse Borlander „Solange ein Buchstabe zugewiesen ist gibt es ein Laufwerk. Wenn Du das Medium aus Deinem DVD-Laufwerk nimmst, dann ändert ...“
Optionen

Dann verstehe ich aber nicht, warum diese Funktion innert ca. Zehntelsekunden wechselnde Werte ausgibt. Entweder ist der Buchstabe zugewiesen und dann würde man 4 erhalten oder zumindest immer was anderes als 1. Oder er ist eben nicht zugewiesen, dann wäre es immer 1, so wie ich es erwartet hätte. Aber nicht einmal 1 und einmal 2 und dies wahllos nacheinander.

bei Antwort benachrichtigen
Sovebämse Nachtrag zu: „Dann verstehe ich aber nicht, warum diese Funktion innert ca. Zehntelsekunden wechselnde Werte ausgibt. Entweder ist der ...“
Optionen

Ich habe jetzt nochmal alles "nackter" gemacht, also ausserhalb meines Programms und gleich eine Funktion gemacht. Jetzt scheint es zu klappen, bin aber noch nicht ganz sicher. Ich vermute, es hatte was mit einer Schleife zu tun.

bei Antwort benachrichtigen
Borlander Sovebämse „Ich habe jetzt nochmal alles nackter gemacht, also ausserhalb meines Programms und gleich eine Funktion gemacht. Jetzt ...“
Optionen
Ich vermute, es hatte was mit einer Schleife zu tun.

Was hast Du da denn implementiert, wenn das solche Nebeneffekte verursacht?

bei Antwort benachrichtigen
Sovebämse Borlander „Was hast Du da denn implementiert, wenn das solche Nebeneffekte verursacht?“
Optionen

Also als Erstes habe ich eine do-while-Schleife gemacht, damit bei einer falschen Passworteingabe (= Laufwerksbuchstabe nicht vorhanden) das Passwort erneut abgefragt wird.

Eine zweite do-while-Schleife soll sicher stellen, dass es nicht durch eine verzögerte Verbindungsherstellung zum Netzlaufwerk (wie ich es manchmal hatte) zu einer vorschnellen erneuten Passwortabfrage kommt. Ich habe dort mit Sleep eine gewisse Zeit verstreichen lassen, damit net use Zeit hat, das Netzlaufwerk zu verbinden. Schliesslich habe ich da noch eine "Fortschrittsanzeige" eingebaut, während der Zeit, wo er auf die Verbindung wartet.

bei Antwort benachrichtigen
Sovebämse Nachtrag zu: „Also als Erstes habe ich eine do-while-Schleife gemacht, damit bei einer falschen Passworteingabe Laufwerksbuchstabe nicht ...“
Optionen

Ich krieg die Krise... jetzt hab ich noch was rumgebastelt, noch eine zusätzliche Abfrage implementiert, die anfangs schaut, ob das Netzlaufwerk schon verbunden ist und eine entsprechende Antwort ausgibt und nun habe ich das Problem schon wieder, dass sporadisch die Schleife beendet wird mit der Meldung, die Verbindung mit dem Netzlaufwerk habe geklappt, obwohl es nicht so ist, auch nicht sein kann, da meine VPN-Verbindung aus ist.

Ich schreib hier mal meinen Code (nicht lachen, ich denke, das sieht ev. eher amateurhaft aus):

Funktion für LW-Buchstabe abfragen:

int checkDriveLetter(WCHAR drive[])
 { 
    UINT driveType = 0;
    driveType = GetDriveType(drive);
    if (driveType != 1 && driveType != 0)
        return 1;
    else
        return 0;
 }

Ablauf im Programm bei Klick auf Netzlaufwerk verbinden:

void Tester2Frame::OnButton3Click(wxCommandEvent& event)
{
int checkDrv = checkDriveLetter(L"U:\\"); //Einlesen, ob Laufwerksbuchstabe da.
int checkMe = 0; //prüft später, ob die Verbindung anfangs bereits bestand.
   

if (checkDrv == 1) //prüft, ob das Laufwerk jetzt schon da ist.
    {
       wxMessageBox("Das Netzlaufwerk ist bereits verbunden!");
       checkMe = 1;
    }

    else //falls LW nicht da, soller folgendes machen.
    {
      while (checkDrv == 0) /so lange LW nicht da, folgendes machen:
        {
            wxTextEntryDialog* test=new wxTextEntryDialog(this,"Bitte das Passwort eingeben:","Passwort","",wxOK|wxTE_PASSWORD);
            test->ShowModal();
            wxString passWordNew = test->GetValue();
            wxMessageBox(passWordNew);
            wxString netUsePw = ( "NET use u: \\\\UNT-Server01\\Plattform /User:xy ");
            WinExec( netUsePw + passWordNew, SW_HIDE );
            int i = 0; //Zähler für nächste Schleife.
            checkDrv = checkDriveLetter(L"U:\\"); //prüft, Laufwerk jetzt da?
            Gauge1->SetValue(0); //Fortschrittsanzeige auf Null
            Gauge1->Show(true); //Fortschrittsanzeige einblenden
            int zaehler = 0; /Zähler für Fortschritsanzeigebalken
      

            while (i < 5 && checkDrv == 0) //mach das bis das LW da ist oder 2,5 Sekunden vorbei.
            {
                Sleep(500);
                checkDrv = checkDriveLetter(L"U:\\");
                i = i + 1;
                zaehler = zaehler + 1;
                Gauge1->SetValue(zaehler);
            }
         }
    }

if (checkDrv == 0) //jetzt soll er melden, falls immer noch LW nicht da.
    {
        wxMessageBox("Das Passwort war falsch. Bitte erneut eingeben.");
    }


if (checkMe == 0) //falls nicht afangs die Verbindung schon bestand, soll er folgendes melden.
    {
        Gauge1->SetValue(5); //Fortschritt auf Maximum.
        wxMessageBox("Anmeldung erfolgreich!");
    }
   
}

bei Antwort benachrichtigen
Sovebämse Nachtrag zu: „Ich krieg die Krise... jetzt hab ich noch was rumgebastelt, noch eine zusätzliche Abfrage implementiert, die anfangs ...“
Optionen

Mir ist nun was aufgefallen:

Es geht hier um eine Verbindung zu einem Netzlaufwerk einer Schule. Wir haben dazu VPN-Zugriff, damit man auch von zuhause aus zugreifen kann. Nun ist mir aufgefallen, dass der Fehler anscheinend nur dann (sporadisch) auftritt, wenn ich die VPN-Verbindung ausschalte und vorher das Netzlaufwerk nicht getrennt habe. Auch nach erneuter VPN-Anmeldung passiert es. Melde ich mich aber korrekt an und trenne das Laufwerk dann zuerst, bevor ich die VPN-Verbindung ausmache, tritt der Fehler, so wie es aussieht, nicht auf. Scheint also an Windows zu liegen.

Gibt es keine Möglichkeit, anstatt nur den LW-Buchstaben die Konnektivität zu prüfen? Sprich: sozusagen eine Anfrage an das Laufwerk senden und schauen, ob das ankommt? Habe schon gedacht, auf dem Laufwerk einen Ordner zu erstellen. Aber da man als Nicht-Admin nur in bestimmte Ordner des Laufwerks schreiben darf, ist das eine unsichere Methode.

Gruss und Dank
Thomas

bei Antwort benachrichtigen
Sovebämse Nachtrag zu: „Mir ist nun was aufgefallen: Es geht hier um eine Verbindung zu einem Netzlaufwerk einer Schule. Wir haben dazu ...“
Optionen

Ich muss den Post oben korrigieren, kann ihn aber nicht mehr bearbeiten:

Ich habe nun mal was probiert:

Im Konsolenprogramm funktioniert ohne "net use" Befehl die Ausgabe zuverlässig. D.h. er meldet immer "kein Laufwerk". Im richtigen Programm, wo also kurz nach (ich hab extra noch 1 Sekunde Wartefrist nach Befehl eingebaut) dem Befehl "net use" wieder geschaut wird, ob der Laufwerksbuchstabe vorhanden ist, kommt immer noch sporadisch "Anmeldung geglückt", obwohl das nicht so ist.

Ich habe jetzt mal parallel zum richtigen Programm das Konsolenprogramm in einer Dauerschleife laufen lassen, während ich im richtigen Programm die Passworteingabe und das Ausführen des "net use" Befehls durchgeführt habe. Und siehe da, auf einmal tauchen in der kurzen Phase falsche Werte auch im Konsolenprogramm auf und zwar auch sporadisch. Manchmal hat er hintereinander sehr viele Male ein "ist verbunden" gemeldet, manchmal nur 1 Mal. Somit scheint die Ursache im "net use" Befehl zu liegen. Anscheinend meldet das System kurzzeitig den Laufwerksbuchstaben, obwohl die Verbindung gar nicht zustande gekommen ist. Hat jemand eine Idee, warum das so ist und wie man Abhilfe schaffen könnte?

Gruss und Dank
Thomas

bei Antwort benachrichtigen