Einsatz im Netzwerk [erledigt]

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Einsatz im Netzwerk [erledigt]

Beitrag von peternmb » Do, 28. Nov 2019 12:11

Hallo,

gibt es unter Xbase eine Möglichkeit auszulesen, ob das aktuelle Verzeichnis eine Netzwerk-Freigabe hat?
Ideal wäre es auch, das Verzeichnis direkt aus dem Programm heraus freizugeben.
Interessant wäre auch zu wissen, ob die kennwortgeschützten Freigaben ein- oder ausgeschaltet sind.
Zuletzt geändert von peternmb am Mo, 02. Dez 2019 13:57, insgesamt 1-mal geändert.

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1512
Registriert: Mi, 28. Jul 2010 17:16

Re: Einsatz im Netzwerk

Beitrag von ramses » Do, 28. Nov 2019 14:04

Das Verzeichnis auf eine vorhandene Freigabe prüfen geht mit der Funktion "NetShareCheck" eine neue Freigabe setzten mit der Funktion "NetShareAdd" beide aus der "netapi32.dll" von Windows.
Valar Morghulis

Gruss Carlo

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Einsatz im Netzwerk

Beitrag von peternmb » Fr, 29. Nov 2019 11:40

ramses hat geschrieben:
Do, 28. Nov 2019 14:04
Das Verzeichnis auf eine vorhandene Freigabe prüfen geht mit der Funktion "NetShareCheck" eine neue Freigabe setzten mit der Funktion "NetShareAdd" beide aus der "netapi32.dll" von Windows.
Das klingt schon einmal super.
Da ich mich mit dem Ansprechen von DLLs kaum auskenne wären einige Zeilen Code sehr hilfreich.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12168
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Einsatz im Netzwerk

Beitrag von AUGE_OHR » Sa, 30. Nov 2019 3:16

hi,
peternmb hat geschrieben:
Fr, 29. Nov 2019 11:40
Da ich mich mit dem Ansprechen von DLLs kaum auskenne wären einige Zeilen Code sehr hilfreich.
deine Anfrage nach Net32 API wird kaum einer beantworten denn es werden Windows Structuren benötigt und mit BAP kommt man nicht weit

Ich habe da eine interessante Website über "The Win32 Network Management APIs" gefunden.

NetShareAdd() Program Example
https://www.installsetupconfig.com/win3 ... 16_38.html

NetShareCheck() Program Example
https://www.installsetupconfig.com/win3 ... 16_39.html

NetShareGetInfo() Program Example
https://www.installsetupconfig.com/win3 ... 16_42.html

die Structuren findet man hier z.b. SHARE_INFO_503 structure
https://docs.microsoft.com/en-us/window ... e_info_503

da die (leider) noch nicht in der Ot4Xb vordefiniert sind muss man sich die erst selbst erstellen.

have Fun
gruss by OHR
Jimmy

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Einsatz im Netzwerk

Beitrag von peternmb » Sa, 30. Nov 2019 13:40

AUGE_OHR hat geschrieben:
Sa, 30. Nov 2019 3:16
...deine Anfrage nach Net32 API wird kaum einer beantworten denn es werden Windows Structuren benötigt und mit BAP kommt man nicht weit
Ich hatte gehofft, dass das über einen einfachen DLL-Call realisierbar ist

Code: Alles auswählen

isfreigabe := DllCall("netapi32.dll", DLL_STDCALL, "NetShareCheck", (Getenv("USERNAME"),ExeDir) )
Bei Ot4Xb habe ich auch schon vergeblich nach solchen Funktionen gesucht, eigentlich hatte ich gehofft dort fündig zu werden.

Was ich bisher gefunden habe müssen an NetShareCheck nur 3 Parameter (Server,Verzeichnis,Typ) übergeben werden.
Ich habe das getestet - Programm stürzt nicht ab und ich bekomme einen numerischen Wert zurück.
Meist ist es die 53 in einem Fall, den ich allerdings nicht reproduzieren kann war es 87.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12168
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Einsatz im Netzwerk

Beitrag von AUGE_OHR » Sa, 30. Nov 2019 19:28

peternmb hat geschrieben:
Sa, 30. Nov 2019 13:40
Ich hatte gehofft, dass das über einen einfachen DLL-Call realisierbar ist
zumindest solltest du es mit UNICODE versuchen
peternmb hat geschrieben:
Sa, 30. Nov 2019 13:40
Bei Ot4Xb habe ich auch schon vergeblich nach solchen Funktionen gesucht, eigentlich hatte ich gehofft dort fündig zu werden.
da hab ich auch zuerst gesucht und nur eine Function gefunden (um die Server Zeit zu holen)
peternmb hat geschrieben:
Sa, 30. Nov 2019 13:40
Programm stürzt nicht ab und ich bekomme einen numerischen Wert zurück.
wie ich schon sagte bekommt man gewöhnlich einen Pointer (numerisch) für eine Adresse "wo" die Information liegt.

das was du an DllCall kennst liefert vermutlich nur "einen Member" zurück als String.
ein Structure ist wie eine DBF aufgebaut. der Pointer wäre die "Recno".
nun will man das "Feld" XYZ davon haben.
Wenn man die Structure hat kommt man wie in OOP "gewohnt" an die Property.
peternmb hat geschrieben:
Sa, 30. Nov 2019 13:40
Meist ist es die 53 in einem Fall
das ist ein DOS Error
53 ERROR_BAD_NETPATH The network path was not found.
---

hast du dir das Sample angesehen https://www.installsetupconfig.com/win3 ... s16_39.html

er fragt doch da Konstanten ab und die sind numerisch

Code: Alles auswählen

#define STYPE_DISKTREE 0
#define STYPE_PRINTQ 1
#define STYPE_DEVICE 2
#define STYPE_IPC 3
#define STYPE_DFS 100
#define STYPE_SPECIAL 0x80000000 
du bekommst also nur als Antwort "ob" die Bedingung stimmt

Bild
---

Frage : was willst du eigendlich erreichen :?:
es gibt ja viele Wege
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14879
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Einsatz im Netzwerk

Beitrag von brandelh » So, 01. Dez 2019 8:36

Dass ein Xbase Programm selbst SHAREs anlegt ist eher ungewöhnlich.
Dafür braucht man je nach Windows Version Admin Rechte.
Ich würde keinem Progrogram sowas erlauben, man weiß ja nicht was der Entwickler tatsächlich macht.
Gruß
Hubert

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1512
Registriert: Mi, 28. Jul 2010 17:16

Re: Einsatz im Netzwerk

Beitrag von ramses » So, 01. Dez 2019 9:26

Hallo Hubert

da hast du recht.

Vermutlich will er ja nur feststellen ob es ein Share ist. .... Dazu gibts in ot4xb eine Funktionen nGetDriveType(<cRootPath>) -> nDriveType

Oder auch ein Beispiel welches die Shares des aktuellen Rechners(Server) auflistet: http://ot4xb-examples.xbwin.com/test-NetShareEnum
Valar Morghulis

Gruss Carlo

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Einsatz im Netzwerk

Beitrag von peternmb » So, 01. Dez 2019 10:38

ramses hat geschrieben:
So, 01. Dez 2019 9:26
...
Vermutlich will er ja nur feststellen ob es ein Share ist. .... Dazu gibts in ot4xb eine Funktionen nGetDriveType(<cRootPath>) -> nDriveType
Ja, das reicht mir fürs Erste - werde ich mir ansehen. Vielen Dank.

Meine Programme verwenden für den Datenaustausch mit Android-Geräten freigegebene Ordner.
Leider sind anscheinend einige - trotz bebilderter Anleitung - nicht in der Lage ein Verzeichnis freizugeben.
Ich möchte deshalb im Programm eine Möglichkeit einbinden zu prüfen ob das korrekte Verzeichnis freigegeben ist.
Der Idealfall wäre es, wenn ich - falls notwendig - auch diese Freigabe direkt aus dem Programm heraus machen könnte, aber das kann ich vermutlich auch über eine kleine Batchdatei (die dann natürlich Adminrechte benötigt) machen.

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Einsatz im Netzwerk

Beitrag von peternmb » So, 01. Dez 2019 11:13

ramses hat geschrieben:
So, 01. Dez 2019 9:26
.... Dazu gibts in ot4xb eine Funktionen nGetDriveType(<cRootPath>) -> nDriveType
Damit kann ich vermutlich nur feststellen ob es ein Netzlaufwerk ist, nicht ob es eine Freigabe hat.

Ich bekomme bei einem vorhandenen lokalen Verzeichnis immer den Rückgabewert 3 - egal ob freigegeben oder nicht.
Falls das Verzeichnis nicht vorhanden ist kommt als Rückgabewert eine 1.

Lt. dem manual 1=DRIVE_NO_ROOT_DIR 3=DRIVE_FIXED

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14879
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Einsatz im Netzwerk

Beitrag von brandelh » So, 01. Dez 2019 13:33

das eine hat mit dem anderen ja auch nix zu tun.

Notfalls könnte man eine CMD im Hintergrund ausführen und die Rückgabe verarbeiten, ich meine Pablo hätte eine CMD Funktion, die den Rückgabewert an eine Variable gibt.

Code: Alles auswählen

net share

Name         Ressource                       Beschreibung

-------------------------------------------------------------------------------
C$           C:\                             Standardfreigabe
D$           D:\                             Standardfreigabe
F$           F:\                             Standardfreigabe
IPC$                                         Remote-IPC
print$       C:\Windows\system32\spool\drivers
                                             Druckertreiber
ADMIN$       C:\Windows                      Remoteverwaltung
HD_C         C:\
HD_D         D:\
Users        C:\Users
Der Befehl wurde erfolgreich ausgeführt.
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14879
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Einsatz im Netzwerk

Beitrag von brandelh » So, 01. Dez 2019 13:44

eine Google Suche nach "API net share" liefert einige Ergebnisse:

=> Win32: API calls to list available network shares on a server?
=> According to the docs there's a NetShareEnum and a WNetEnumResource function.

:arrow: https://docs.microsoft.com/de-de/window ... dfrom=MSDN

mit ot4xb kann man das auf jeden Fall aufrufen, der Hinweis dass man den Speicher wieder freigeben muss ... nun ja wir übergeben meist eine Xbase String Var per Referenz mit viel Platz drin,
aber besser man nach dieser Funktion in Xbase++ Forum hier etc. suchen.
Hinweis hat geschrieben: This function applies only to Server Message Block (SMB) shares.
For other types of shares, such as Distributed File System (DFS) or WebDAV shares, use Windows Networking (WNet) functions, which support all types of shares.
eine suche hier nach NetShareEnum findet den Hinweis auf Pablo ...

:arrow: https://www.xbaseforum.de/viewtopic.php ... 2A#p129462

und wie ich eben sehe hat genau den Link auf Pablos Beispiel auch schon ramses einige Posts darüber geliefert ... blind bin ich 8)

:arrow: https://www.xbaseforum.de/viewtopic.php ... 56#p131052
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14879
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Einsatz im Netzwerk

Beitrag von brandelh » So, 01. Dez 2019 13:58

Paplos Code sieht zwar C/C++ lastig aus, aber man kann das ja in eine einfache Funktion umbauen, die statt der Ausgabe ein Array erzeugt etc.
Gruß
Hubert

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Einsatz im Netzwerk

Beitrag von peternmb » So, 01. Dez 2019 15:05

Ich mache es über einen runshell-Aufruf, das ist wie ich sehe die einfachste Variante.

Code: Alles auswählen

proc prufnet
//
LOCAL ret:=.T.
//
RunShell( "/C net share > "+hauptpfad+"\Daten\shares.txt" )
//
cText:= MemoRead(hauptpfad+"\Daten\shares.txt")
findpos=AT(upper(ExeDir),upper(cText)) 
if findpos = 0      
// msgbox("Keine Freigabe")
    ret=.F.
else
// msgbox("Freigabe OK")
endif
//
return ret

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12168
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Einsatz im Netzwerk

Beitrag von AUGE_OHR » So, 01. Dez 2019 17:17

da nun klar ist was du möchtest kann man einfach eine Listbox benutzen.
klar muss man die "pimpen" damit es funktioniert

siehe dazu meine Session 2016
LB_DIR
Adds names to the list displayed by a list box. The message adds the names of directories
and files that match a specified string and set of file attributes. LB_DIR can also add
mapped drive letters to the list box.

Code: Alles auswählen

PROCEDURE PimpMyXb(oListBox)
LOCAL hWnd
LOCAL iAttr
LOCAL cMask

   // get all Drive
   //
   hWnd  := oListBox:getHWND()
   iAttr := DDL_DRIVES
   cMask := "C:"
   SendMessageA( hWnd, LB_DIR, iAttr , cMask )

RETURN
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12168
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Einsatz im Netzwerk

Beitrag von AUGE_OHR » Mo, 02. Dez 2019 1:34

hi,

wir haben nach der "falschen" DLL gesucht ... wir brauchen "Mpr.Dll" :roll:

Code: Alles auswählen

Function GetUncName(cPath)
LOCAL cInfo    := Space(1000)
LOCAL nInfoLen := 1000
   if DllCall("MPR.dll", DLL_OSAPI, "WNetGetUniversalNameA", @cPath, 1 , ;
              @cInfo, @nInfoLen) == 0
      cInfo := Trim(SubStr(StrTran(cInfo, chr(0)), 5))
   else                            // Error or No UNC path (e.g. C:\)
      cInfo := cPath
   endif
return (cInfo)
gruss by OHR
Jimmy

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 505
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Einsatz im Netzwerk

Beitrag von peternmb » Mo, 02. Dez 2019 13:57

Hallo Jimmy,
peternmb hat geschrieben:
Do, 28. Nov 2019 12:11
gibt es unter Xbase eine Möglichkeit auszulesen, ob das aktuelle Verzeichnis eine Netzwerk-Freigabe hat?
Anscheinend ein Missverständnis, ich möchte nicht wissen ob das ein Netzlaufwerk ist sondern ob mein aktuelles Verzeichnis freigegeben ist.

Mit runshell funktioniert das jetzt prima.

Ich kann mittlerweile auch direkt aus dem Programm heraus, falls noch nicht vorhanden, die Freigabe und die Rechte setzen.
Mein Programm erstellt eine kleine Batchdatei, die dann als Admin abgearbeitet wird, darin wird das Verzeichnis freigegeben und es werden die benötigten Rechte gesetzt. Damit meine Batchdatei Adminrechte anfordert ist ein kleines kostenloses Zusatzprogramm (NirCMD) erforderlich. Damit lassen sich mit dem Befehl "elevate" (http://nircmd.nirsoft.net/elevate.html) für die Batchdatei Adminrechte anfordern - funktioniert perfekt.

Antworten