c - WNetAddConnection2 opretter for mange stik i Windows Server 2008 HPC Edition

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kalder WNetAddConnection2 mange gange uden WNetCancelConnection2, jeg kontrollerer bare dens returværdi. Dette virker i Windows Server 2003, skab kun en forbindelse, men i Windows Server 2008 skabte den for mange forbindelser. Hvad er problemet?


EDIT - kode efter kommentar:



TCHAR szLocalName[32] = \_T("t:"), szRemoteName[MAX\_PATH] = \_T("\\ws2008\_1\sample\_share");

// Assign our values to the NETRESOURCE structure. 
nr.dwType = RESOURCETYPE\_ANY; 
nr.lpLocalName = szLocalName; 
nr.lpRemoteName = szRemoteName; 
nr.lpProvider = NULL; 

// Call the WNetAddConnection2 function to assign 
// a drive letter to the share. 
dwRetVal = WNetAddConnection2(&nr, 0, 0, FALSE);


Output er:


mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:8956
mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:7284
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:8592
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:4196
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:7708
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:7028
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:3988
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:3680
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:6364
remote name is <\ws2008\_1sample\_share\_2> and errCode is: 85 PID:7764
mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:8764
mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:4692
mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:4996
mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:5300
mount <x:> to <\ws2008\_1sample\_share\_2> with :0 PID:6028


Bemærk: processen blev oprettet af CreateProcessAsUser, brugernavnet er det samme. Fra logbeskeden virker det nogle gange, er det logon session relateret?


Tak


DMA

Bedste reference


Fejlmeddelelserne er IKKE session relaterede ... det siger ERROR\_ALREADY\_ASSIGNED (se http://msdn.microsoft.com/en-us/library/ms681382\%28v=vs.85\%29.aspx). [8]


Det betyder, at den metode, du bruger til at montere, er blevet kaldt mere end en gang i den session (forskellige dele af din ansøgning, flere forekomster af programmet i samme session, genstartet ansøgning i samme session ...).


Din metode til at gøre det er fejlbehæftet - du skal:



  • Sørg for, at kun én proces i samme session prøver en mount, f.eks. med en navngivet Mutex se http://msdn.microsoft.com/en-us/library/ms682411\%28v=vs.85 \% 29.aspx

  • Kontrollér, før du forsøger at montere, hvis det respektive drevbogstav allerede er i brug, se WNetGetConnection på http://msdn.microsoft.com/en-us/library/aa385453\%28v=VS.85\%29. aspx, og hvis det måske er kortlagt til den korrekte andel (returværdi lpRemoteName)

  • når sessionen slutter/programmet afsluttes, skal du afmontere se WNetCancelConnection2 på http://msdn.microsoft.com/en-us/library/aa385427\%28v=VS.85\%29.aspx



Der er andre punkter at sørge for ... men de afhænger af svarene på følgende spørgsmål: [9] [10] [11]



  • Kører applikationen i samme session flere gange?

  • Prøve applikationen monteringen i forskellige dele af applikationen?

  • Er dette et TerminalServer-miljø?