Einsatz im Netzwerk [erledigt]
Moderator: Moderatoren
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Einsatz im Netzwerk [erledigt]
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.
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.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Einsatz im Netzwerk
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
Gruss Carlo
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Einsatz im Netzwerk
Das klingt schon einmal super.
Da ich mich mit dem Ansprechen von DLLs kaum auskenne wären einige Zeilen Code sehr hilfreich.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Einsatz im Netzwerk
hi,
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
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
Jimmy
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Einsatz im Netzwerk
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) )
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.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Einsatz im Netzwerk
zumindest solltest du es mit UNICODE versuchen
da hab ich auch zuerst gesucht und nur eine Function gefunden (um die Server Zeit zu holen)
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.
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
---
Frage : was willst du eigendlich erreichen
es gibt ja viele Wege
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Einsatz im Netzwerk
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.
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
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Einsatz im Netzwerk
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
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
Gruss Carlo
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Einsatz im Netzwerk
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.
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Einsatz im Netzwerk
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
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Einsatz im Netzwerk
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.
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
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Einsatz im Netzwerk
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.
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.
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
https://www.xbaseforum.de/viewtopic.php ... 56#p131052
=> Win32: API calls to list available network shares on a server?
=> According to the docs there's a NetShareEnum and a WNetEnumResource function.
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.
eine suche hier nach NetShareEnum findet den Hinweis auf Pablo ...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.
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
https://www.xbaseforum.de/viewtopic.php ... 56#p131052
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Einsatz im Netzwerk
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
Hubert
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Einsatz im Netzwerk
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
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Einsatz im Netzwerk
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
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
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Einsatz im Netzwerk
hi,
wir haben nach der "falschen" DLL gesucht ... wir brauchen "Mpr.Dll"
wir haben nach der "falschen" DLL gesucht ... wir brauchen "Mpr.Dll"
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
Jimmy
-
- 1000 working lines a day
- Beiträge: 525
- Registriert: Mi, 01. Feb 2006 16:22
- Wohnort: 06618 Naumburg
Re: Einsatz im Netzwerk
Hallo Jimmy,
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.
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.