AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erkennen von Remote Desktop

Ein Thema von Alfonso · begonnen am 1. Nov 2010 · letzter Beitrag vom 3. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2      
Alfonso

Registriert seit: 10. Jan 2006
242 Beiträge
 
Delphi 11 Alexandria
 
#1

Erkennen von Remote Desktop

  Alt 1. Nov 2010, 18:48
Hallo,
ich muss in meinem Programm (Delphi 2006) erkennen, ob es über Remote Desktop aufgerufen wird.
Hat jemand eine Idee wie man das rausbekommt?

Gruß
Alfonso
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 19:00
Darf man fragen warum?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#3

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 19:02
Darf man fragen warum?
Bspw. um Double-Buffering abzuschalten, da dies über RDP sinnlos ist.

@Alfonso: MSDN-Library durchsuchenSystemParametersInfo

Oops, knapp daneben ist auch vorbei: MSDN-Library durchsuchenGetSystemMetrics mit SM_REMOTESESSION.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad ( 1. Nov 2010 um 19:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 19:03
Wieder was gelernt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 19:10
Vielleicht doch noch ein paar Worte dazu warum Double-Buffering sinnlos ist über RDP.

RDP basiert darauf, daß bei kleiner Bandweite möglichst performant der Eindruck eines flüssigen Arbeitens vermittelt werden kann. Double-Buffering ist die Methode seine Inhalte erst auf einen DC im Speicher zu zeichnen und diesen dann komplett (also quasi wie eine Bitmap) auf den Bildschirmbereich zu kopieren der aktualisiert werden soll. Während das lokal eine sinnvolle Vorgehensweise ist, steht diese bei RDP dem vorgenannten Ziel entgegen: schnell zu sein. Denn während es in der Tat lokal schneller ist einen kompletten DC zu kopieren, ist es über RDP so, daß wir eine weitaus größere Datenmenge als unbedingt notwendig übertragen müssen, was an der Geschwindigkeit kratzt.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Alfonso

Registriert seit: 10. Jan 2006
242 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 19:44
In meinem Programm kann man Dateien in die Datenbank kopieren.
Ich bitte meinen Anwemdern nicht den normalen Dateiauswahldialog an, sondern habe auf basis von TFilelistbox eine eigene Dateiauswahl gemacht. Wenn ich mein Programm über Remotedesktop aufrufe, soll das Quell-Laufwerk natürlich nicht C:, D: oder ähnliches sein, da dieses ja auf dem Remoterechner liegt. Ich muss in diesem Fall erkennen, welche Laufwerke er Remote als lokale Ressource eingebunden hat, in dem ich folgendes mache:
Delphi-Quellcode:
for i := 67 to 90 do
  begin
   if DirectoryExists('\\tsclient\'+chr(i)+'\') then
    cbbDrive.Items.Add('Remote '+chr(i));
  end;
Dann werden diese "Netzlaufwerke" als Quelllaufwerke angezeigt.

Oder gibt es etwas einfacheres?

Gruß
Alfonso
Alfonso
Seit Turbo Pascal 3.0 dabei!
Ewiger Pascal Fan!
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#7

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 20:05
Oder gibt es etwas einfacheres?
Da müßtest du mal Remko fragen (der ist auch Benutzer hier, aber dann ggf. auf Englisch fragen ).

Es könnte durchaus eine der WTS*-Funktionen besser geeignet sein, aber ich müßte mich erst einlesen und er weiß es vielleicht ohne Nachgucken.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#8

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 20:50
Selbst wenn es anders besser geht,
aber so sieht es bestimmt etwas übersichtlicher aus.
Delphi-Quellcode:
var c: Char;

for c := 'Cto 'Zdo
  if DirectoryExists('\\tsclient\' + c) then
    cbbDrive.Items.Add('Remote ' + c);
Du könntest doch immer nach Remote-Laufwerken suchen und alle lokalen ( X: ) und Remote-Laufwerke ( \\tsclient\X ) anbieten, egal wo das Programm läuft.

Eventuell möchte auch mal jemand via Remote ein lokales Laufwerk nutzen und umgekehrt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Nov 2010 um 20:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#9

AW: Erkennen von Remote Desktop

  Alt 1. Nov 2010, 22:54
Oder gibt es etwas einfacheres?
Da müßtest du mal Remko fragen (der ist auch Benutzer hier, aber dann ggf. auf Englisch fragen ).

Es könnte durchaus eine der WTS*-Funktionen besser geeignet sein, aber ich müßte mich erst einlesen und er weiß es vielleicht ohne Nachgucken.
Sadly there is not Wts* or even WinStation* function that can do this, but I tested the code below and that's the only way I see to enumerate all Client Drives:

Delphi-Quellcode:
uses
  JwaWinType, JwaWinNetWk; // Jedi Apilib, can also use JwaWindows instead of Single Units

const
  WNNC_NET_TERMSRV = $00360000;

type
  TNetResourceArray = array[0..ANYSIZE_ARRAY-1] of NETRESOURCE;
  PNetResourceArray = ^TNetResourceArray;

procedure TForm3.Button1Click(Sender: TObject);
var
  NetResPtr: PNetResourceArray;
  ProviderName: array[0..MAX_PATH] of Char;
  BufSize: DWORD;
  hEnum: DWORD;
  Count: DWORD;
  Res: Cardinal;
  i: Integer;
begin
  // Get Provider Name (should be 'Microsoft Terminal Services')
  BufSize := Length(ProviderName) * SizeOf(Char);
  ZeroMemory(@ProviderName[0], BufSize);
  Res := WNetGetProviderName(WNNC_NET_TERMSRV, ProviderName, BufSize);
  if Res <> NO_ERROR then
  begin
    // Handle the Error (call WNetGetLastError for more info), raise exception..
  end;

  Memo1.Lines.Add(Format('ProviderName=%s', [ProviderName]));
  Res := WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, nil, hEnum);
  if Res = NO_ERROR then
  begin

    // return as many entries as possible
    Count := DWORD(-1);

    // Allocate a some memory, 16 KB is typical size per docs
    BufSize := 16384;
    Memo1.Lines.Add(Format('Allocate %d Bytes', [BufSize]));
    GetMem(NetResPtr, BufSize);
    Res := WNetEnumResource(hEnum, Count, NetResPtr, BufSize);

    while Res = ERROR_MORE_DATA do
    begin
      Inc(BufSize, SizeOf(NETRESOURCE));
      Memo1.Lines.Add(Format('Allocate %d Bytes', [BufSize]));
      ReAllocMem(NetResPtr, BufSize); // Alloc more...
      Count := DWORD(-1);
      Res := WNetEnumResource(hEnum, Count, NetResPtr, BufSize);
    end;

    if Res = NO_ERROR then
    begin
      Memo1.Lines.Add(Format('Count=%d', [Count]));
      for i := 0 to Count - 1 do
      begin
        if lstrcmpi(NetResPtr^[i].lpProvider, @ProviderName[0]) = 0 then
        begin
          Memo1.Lines.Add(Format('Found TSClient Drive: %s', [NetResPtr^[i].lpRemoteName]));
        end
        else begin
          Memo1.Lines.Add(Format('Found non TSClient Drive: %s', [NetResPtr^[i].lpRemoteName]));
        end;
      end;
    end
    else begin
      Memo1.Lines.Add(Format('WNetEnumResource returned %d', [Res]));
    end;

    FreeMem(NetResPtr);
    WNetCloseEnum(hEnum);
  end
  else begin
    Memo1.Lines.Add(Format('WNetOpenEnum returned %d', [Res]));
  end;
end;

end.
On my testsystem the output is:
ProviderName=Microsoft Terminal Services
Allocate 16384 Bytes
Count=3
Found TSClient Drive: \\tsclient\Z
Found TSClient Drive: \\tsclient\C
Found TSClient Drive: \\tsclient\D
See my blog blog
See our Jedi blog

Geändert von Remko ( 1. Nov 2010 um 23:10 Uhr)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

AW: Erkennen von Remote Desktop

  Alt 2. Nov 2010, 16:09
Raymond Chen hat auch was geschrieben, wann man auf RDP prüfen sollten und warum:
http://blogs.msdn.com/b/oldnewthing/...03/508694.aspx
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz