Partage à distance

Signaler
Messages postés
39
Date d'inscription
vendredi 24 janvier 2003
Statut
Membre
Dernière intervention
12 janvier 2006
-
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005
-
quelqu'un sait-il se servir de NetShareAdd car j'ai tjs l'erreur 53 en code de retour
ma fct :

mafctCreerPartage(LPSTR pPoste, LPSTR pCheminPartage, LPSTR pNomPartage, LPSTR pErreur)
NET_API_STATUS nStatus = 0;
SHARE_INFO_2  shareinfo;
DWORD dwErrArg;

strcpy(pErreur, "");

shareinfo.shi2_netname = pNomPartage;
shareinfo.shi2_type = STYPE_DISKTREE;
shareinfo.shi2_remark = TEXT("Test");
shareinfo.shi2_permissions = ACCESS_ALL;
shareinfo.shi2_max_uses = (unsigned long)(-1);
shareinfo.shi2_current_uses = 0;
shareinfo.shi2_path = pCheminPartage;
shareinfo.shi2_passwd = NULL;

nStatus = NetShareAdd(pPoste, 2, (unsigned char *)(&shareinfo), &dwErrArg);

if(nStatus == NERR_Success)
{
// Le partage a echoue
return 0;
}
else
{
// Erreur
return 1;
}// fin if
}

8 réponses

Messages postés
39
Date d'inscription
vendredi 24 janvier 2003
Statut
Membre
Dernière intervention
12 janvier 2006

un peu d'aide svp
merci
Messages postés
39
Date d'inscription
vendredi 24 janvier 2003
Statut
Membre
Dernière intervention
12 janvier 2006

c'est la crise car dans la structure SHARE_INFO_2 sur MSDN on a des format LPWSTR
alors que dans le code quand on recherche la définition de la structure SHARE_INFO_2 on a des format LPTSTR
alors pour les convertion ANSI -> UNICODE c'est la galère

il me faut de l'aide please
Messages postés
4
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
4 mars 2004

Bonjour,

Voici une façon de convertir la variable pPoste et les champs shi2_netname et shi2_path.


char wideCharPoste[256];
if ( pPoste !=  NULL )
MultiByteToWideChar( CP_ACP , 0 , pPoste , strlen( pPoste ) + 1 , (LPWSTR) wideCharPoste , 256 );

char  wideCharCheminPartage [256];
if ( pCheminPartage ! = NULL )
MultiByteToWideChar( CP_ACP , 0 , pCheminPartage , strlen( pCheminPartage ) + 1 , (LPWSTR) wideCharCheminPartage , 256 );

char wideCharNomPartage[256];
if ( pNomPartage !=  NULL )
MultiByteToWideChar( CP_ACP , 0 , pNomPartage , strlen( pNomPartage ) + 1 ,  (LPWSTR) wideCharNomPartage , 256 );

shareinfo.shi2_netname =  wideCharNomPartage ;
shareinfo.shi2_type  = STYPE_DISKTREE;
shareinfo.shi2_remark =  TEXT("Test");
shareinfo.shi2_permissions = ACCESS_ALL;
shareinfo.shi2_max_uses = (unsigned long)(-1);
shareinfo.shi2_current_uses = 0;
shareinfo.shi2_path =  wideCharCheminPartage ;
shareinfo.shi2_passwd  = NULL;


Puis appel de la fonction :
nStatus = NetShareAdd( wideCharPoste , 2, (unsigned char *)(&shareinfo), &dwErrArg);


Kolph
Messages postés
39
Date d'inscription
vendredi 24 janvier 2003
Statut
Membre
Dernière intervention
12 janvier 2006

C'est bon ma fonction marche et je la mets pour ceux à qui ça peut servir :

//fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
//fff                                                                CreerPartage   fff
//fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// Creation d'un partage sur un poste distant
// MSDN help
// NetShareAdd : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netshareadd.asp
DECLSPEC BOOL WINAPI CreerPartage(LPSTR pPoste, LPSTR pCheminPartage, LPSTR pNomPartage, LPSTR pCommentairePartage, LPSTR pErreur)
{
NET_API_STATUS nStatus = 0;
SHARE_INFO_2  shareinfo;
DWORD dwErrArg;

strcpy(pErreur, "");

if(!pPoste || !pCheminPartage || !pNomPartage || !pCommentairePartage)
{
return 1;
}// fin if

if(strncmp(pPoste, "\\\",2) != 0)
{
return 1;
}// fin if

shareinfo.shi2_path = AsWideString(pCheminPartage);
shareinfo.shi2_netname = AsWideString(pNomPartage);
shareinfo.shi2_remark = AsWideString(pCommentairePartage);

shareinfo.shi2_type = STYPE_DISKTREE;
shareinfo.shi2_permissions = ACCESS_ALL;
shareinfo.shi2_max_uses = (unsigned long)(-1);
shareinfo.shi2_current_uses = 0;
shareinfo.shi2_passwd = NULL;

nStatus = NetShareAdd(AsWideString(pPoste), 2, (unsigned char *)(&shareinfo), &dwErrArg);

if(nStatus == NERR_Success)
{
// Le partage cree
return 0;
}
else
{
// Erreur
return 1;
}// fin if
}// fin fonction CreerPartage

//fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
//fff                                                                AsWideString   fff
//fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// Converti AINSI en UNICODE
static char* AsWideString(const char* cszANSIstring)
{
int nBufSize = 0;

if( cszANSIstring == NULL )
{
return NULL;
}// fin if

nBufSize = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cszANSIstring, -1, NULL, 0);
WCHAR* wideString = new WCHAR[nBufSize+1];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cszANSIstring, -1, wideString, nBufSize);

return reinterpret_cast<char*>(wideString);
}// fin fonction AsWideString


Mais est-il possible de créer un dossier sur un poste à distance pour ensuite le partager et y a t'il un moyen de faire correspondre les droits UNIX à ceux de NT (pour un contrôle total)?
Messages postés
4
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
4 mars 2004

Merci CWiCnetExample pour AsWideString(...) !!!

Pour créer un dossier à distance, il faut déjà avoir les droits (je sais, c'est évident, mais il est toujours préférable de le rappeler).

Si c'est à partir d'un dossier qu'on vient de partager (avec la fonction CreerPartage(...)), pourquoi ne pas alors mapper ce dossier puis utiliser _mkdir?

Kolph
Messages postés
39
Date d'inscription
vendredi 24 janvier 2003
Statut
Membre
Dernière intervention
12 janvier 2006

Non je doit créer un dossier sur un poste puis le partager sans qu'il ai un sous-dossier déjà partagé !

Sinon je sais plus où j'ai trouvé ''AsWideString'', mais j'avoue elle n'est pas de moi, en tout cas elle est bien pratique !
Messages postés
8
Date d'inscription
samedi 10 avril 2004
Statut
Membre
Dernière intervention
22 avril 2004

salut amis, j'ai travailler sur les api de netapi32.dll mais tjr j'ai eu lepb de cree un partage et j'ai même pose la question sur ce forum avec un code en mode console, losque vous le compiler pas erreur et il s'execute mais pas de résultat le (repertoire n'est pas partagé)
le code:
//---------------------------------
#include <winsock2.h>
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <malloc.h>
#include <lmerr.h>
#include <conio.h>

#define STYPE_DISKTREE 0
#define STYPE_PRINTQ 1
#define STYPE_DEVICE 2

#define ACCESS_READ 0

#define MAX_USES -1
#define COURRANT_USES 0

typedef DWORD (__stdcall *NetShareAddNT_t)(
wchar_t *servername,
DWORD level,
byte **buf,
DWORD parm_err);

typedef struct _SHARE_INFO_2_NT {
wchar_t * shi2_netname;
DWORD shi2_type;
wchar_t * shi2_remark;
DWORD shi2_permissions;
DWORD shi2_max_uses;
DWORD shi2_current_uses;
wchar_t * shi2_path;
wchar_t * shi2_passwd;
} SHARE_INFO_2_NT, *PSHARE_INFO_2_NT, *LPSHARE_INFO_2_NT;

void main()
{
DWORD dwlevel=2,c=0,a=5;
PSHARE_INFO_2_NT buff,p;
buff = new (_SHARE_INFO_2_NT);
char str2[256];
strcpy(str2, "Essai");
WCHAR hst2[20];
MultiByteToWideChar( CP_ACP, 0, str2, strlen(str2)+1, hst2, sizeof(hst2)/sizeof(hst2[0]));

char str3[256];
strcpy(str3, "D:\DINE");
WCHAR hst3[20];
MultiByteToWideChar( CP_ACP, 0, str3, strlen(str3)+1, hst3, sizeof(hst3)/sizeof(hst3[0]));
//-----------------
buff->shi2_current_uses=COURRANT_USES;
buff->shi2_max_uses=MAX_USES;
buff->shi2_netname=hst2;
buff->shi2_path=hst3;
buff->shi2_permissions=ACCESS_READ;
buff->shi2_type=STYPE_DISKTREE;

printf("\ntype de partage :: %d",buff->shi2_type);
printf("\npermission :: %d",buff->shi2_permissions);
printf("\nmax users :: %d",buff->shi2_max_uses);
printf("\ncourranr users :: %d",buff->shi2_current_uses);

//printf("\nremarque :: %s",buff->shi2_remark);
//printf("\nmotpasse :: %s",buff->shi2_passwd);
printf("\nrepertoire de partage :: %s",buff->shi2_path);
printf("\nnom de partage ::%s",buff->shi2_netname);

p=buff;
//-----------------
DWORD res=NULL;
HINSTANCE hNet = 0;
hNet = LoadLibrary( "netapi32.dll" );

NetShareAddNT_t NetShareAddNT = 0;

NetShareAddNT = (NetShareAddNT_t) GetProcAddress( hNet, "NetShareAdd" );
if ( NetShareAddNT == 0 )
{
printf("erreur !!! \n");
}

char str1[256];
strcpy(str1, "\\\");
strcat(str1, "172.167.0.39");
WCHAR hst1[20];
MultiByteToWideChar( CP_ACP, 0, str1, strlen(str1)+1, hst1, sizeof(hst1)/sizeof(hst1[0]));

res=NetShareAddNT(hst1,dwlevel,(LPBYTE *)&p,NULL);

//erreur type
if(res==ERROR_ACCESS_DENIED) printf("1\n");
if(res==ERROR_INVALID_LEVEL) printf("2\n");
if(res==ERROR_INVALID_NAME) printf("3\n");
if(res==ERROR_INVALID_PARAMETER) printf("4\n");
if(res==NERR_DuplicateShare) printf("5\n");
if(res==NERR_RedirectedPath) printf("6\n");
if(res==NERR_UnknownDevDir) printf("7\n");
else
printf("????????????");
getch();
}
//------------------------------------------------

Aussi jai utuiliser votre fonction mais pas de résultats cette fonction ne génére pas erreur mais pas de resultat
je pose la question: est ce que vous avez verifier que cette fonction a bien partagé le fichier mis en in put?
si oui donné mois un exemple comment vous avez enter vos parametres exemple.

2. question: si vous avez programmez l'api NetShareEnum et vous avez specifier le buffer _INFOS_SHARE_2 avez vous recuper les permissions des fichiers partagés?
car moi j'ai partagé par exemple des fichier mode ecriture et autre mode lucture et mode creation et losque je l'execute elle me donne tjr privilège 0(acces_noone).
avez vous ce pb?
sinon expliquez moi comment vous avez fait?
le systeme d'exploitation utiliser Win2000 et langage VC++.
merci BC et A++++ votre amis samir.
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Salut,

Je ne sais pas si tu as finalement réussi ce que tu essayais de faire mais j'ai le même problème. A savoir : je n'ai pas de difficultés pour partager un dossier sur le reseau mais j'ai des problèmes pour le créer.

KOLPH a dit : Pour créer un dossier à distance, il faut déjà avoir les droits (je sais, c'est évident, mais il est toujours préférable de le rappeler).

_Pas si évident car le dossier dans lequel je veux créer un dossier partagé m'est inaccessible par l'explorer. Par contre, en utilisant le 'Computer Manager' de windows, lorsque je crée le partage et que le dossier n'existe pas, il me propose de le créer. Chose que ne fait pas la fonction 'NetShareAddNT'.

Enfin, si quelqu'un a une réponse pour savoir comment créer un dossier sur le reseau autrement qu'avec un mkdir, avec une dll, ça m'interesse.

Merci