Einzelnen Beitrag anzeigen

Kyro

Registriert seit: 16. Aug 2005
Ort: Wien
45 Beiträge
 
Delphi XE2 Professional
 
#6

AW: WNetENumResource -> Unterschiede auf Win7 und Win 8 / 8.1

  Alt 12. Nov 2013, 22:41
Ich muss meine vorherige Info leicht abändern - denn das Verhalten hat sich nicht mit Windows 8 geändert...
Das Verhalten gab es schon mit Windows Vista und auch mit Windows 7. Es dürfte also mehr Faktoren geben als nur dem Registry Key und eine aktivierte UAC wann es sich so verhält wie du es bereits von Windows 8/8.1 kennst!
Ich würde jedenfalls davon abraten dem ganzen einem Windows 8 Check o.ä. zu verpassen.

Aus meiner Sicht arbeitet "WNetEnumResource" nach wie vor wie es sein soll (Es listet nämlich die Netzlaufwerke genauso auf wie es z.B.: ein TFileOpenDialog machen würde)

Anderes Szenario - gleiches Problem...
UserA ist kein Administrator, und er macht einen rechtsklick auf dein Programm -> "Als Administrator ausführen..." -> nun gibt er die Credentials von UserB (der Administrator ist) ein -> Das Programm startet mit den Rechten von UserB -> In dem Fall wirst du die Laufwerke von UserA ebenfalls nicht sehen - es sei denn du berücksichtigst exakt dieses Szenario.

Unabhängig von dem Problem, wirst du noch in ganz andere Probleme mit UAC laufen wenn du nicht im vorhinein UAC-Aware programmierst.

Falls du ausschließlich die Laufwerke des Benutzers anzeigen lassen willst (und nicht darauf mit dem Laufwerksbuchstaben zugreifen musst) könntest du folgende Quick&Dirty Routine verwenden:

Code:
procedure GetUserNetDrivesPerReg(var LaufWerke_Lokal: TStrings; LaufWerke_Remote: TStrings);
var i: Integer;
var Reg: TRegistry;
var ValidEntry: Boolean;
begin
  Reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Network',False) then begin
      Reg.GetKeyNames(LaufWerke_Lokal);
      Reg.CloseKey;
      for i := Pred(LaufWerke_Lokal.Count) downto 0 do begin
        ValidEntry := False;
        if Reg.OpenKey('Network\'+LaufWerke_Lokal[i],False) then begin
          if Reg.ValueExists('RemotePath') then begin
            LaufWerke_Remote.Add(Reg.ReadString('RemotePath'));
            LaufWerke_Lokal[i] := LaufWerke_Lokal[i]+':';
            ValidEntry := True;
          end;
          Reg.CloseKey;
        end;
        if not ValidEntry then LaufWerke_Lokal.Delete(i);
      end;
    end;
  finally
    Reg.Free;
  end;
end;
  Mit Zitat antworten Zitat