windows - Afmontering og derefter omgående genmontering af SMB-andel, da forskellige brugere fejler

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på en MFC-applikation, der kører på Windows XP SP3. Et af kravene er, at når en bruger logger ind i applikationen, skal applikationen montere flere SMB-aktier, der er hostet på en integreret Linux-server ved hjælp af brugerens legitimationsoplysninger.


Programmet har en 'switch user' -funktion, som giver en anden bruger mulighed for at logge ind uden at lukke applikationen og afslutte den første brugers session. Når det sker, skal SMB-aktierne afmonteres og derefter genmonteres som den nye bruger.


Vi gør dette ved at ringe WNetCancelConnection2 efterfulgt straks af WNetAddConnection2. WNetCancelConnection2 returnerer NO\_ERROR, hvilket angiver, at det lykkedes. Men nogle gange vil WNetAddConnection2 ikke kunne genmontere drevet som den nye bruger. Brug af FormatMessage for at opnå en fejlstreng fra returværdien resulterer i denne fejlmeddelelse på trods af det faktum at WNetCancelConnection2 syntes at lykkes: [13] [14]



  

    Flere forbindelser til en server eller delt ressource af samme bruger, der bruger mere end et brugernavn, er ikke tilladt. Afbryd alle tidligere forbindelser til serveren eller den delte ressource, og prøv igen.

  



At køre net use fra kommandoprompten viser heller ikke en åben forbindelse til SMB-aktien.


Denne fejl vil ikke opstå, hvis brugeren aldrig interagerer med det monterede drev. Det sker kun, hvis brugeren har fået adgang til det monterede drev på en eller anden måde, dvs. brugeren åbnede det monterede drev i Windows Stifinder. Ligeledes forekommer det ikke, hvis du afslutter programmet helt og derefter genstarter det og logger ind som en anden bruger.


Alt dette fører mig til at tro på, at der er en løbskondition, hvor WNetCancelConnection2 vender tilbage, før alle åbne håndtag til netværksressourcerne er lukket. Mit spørgsmål er Kan jeg lave min programblok eller vente efter at have ringet WNetCancelConnection2, indtil alle disse håndtag er lukket, hvilket sikrer at WNetAddConnection2 ikke mislykkes på denne måde? Enten en blokering API eller en måde at optage på - Vent til forbindelsen er helt lukket ville være acceptabel. Enten ville være at foretrække for sleep() og håber på det bedste. :-)

Bedste reference