Jump to content
Ana789

[Resolvido] Partilhar pasta

Recommended Posts

Ana789

olá,

Alguém sabe como partilhar uma pasta em delphi? Estou a usar o Delphi 2010.

Já experimentei alguns exemplos que encontrei, a pasta fica partilhada, mas fica inacessivel ao tentar aceder a partir de outros pc em rede.

Share this post


Link to post
Share on other sites
nunopicado

Como assim?

Queres criar uma partilha de Windows a partir de um software em Delphi?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

Se queres criar uma utilizando a implementação que o MS Windows traz, do protocolo SMB, vais ter algumas dificuldades a lidar com previlégios necessários à tua aplicação.

Se procurares bem, vais ver que encontras algumas implementações que funcionam, pelo menos no Windows 7.

type
   SHARE_INFO_2 = record
  shi2_netname : pWideChar;
  shi2_type    : DWORD;
  shi2_remark  : pWideChar;
  shi2_permissions : DWORD;
  shi2_max_uses    : DWORD;
  shi2_current_uses: DWORD;
  shi2_path	    : pWideChar;
  shi2_passwd	  : pWideChar;
   end;
   PSHARE_INFO_2 = ^SHARE_INFO_2;
   const
  NERR_SUCCESS   = 0;
  STYPE_DISKTREE = 0;
  STYPE_PRINTQ   = 1;
  STYPE_DEVICE   = 2;
  STYPE_IPC	  = 3;
  ACCESS_READ    = $01;
  ACCESS_WRITE   = $02;
  ACCESS_CREATE  = $04;
  ACCESS_EXEC    = $08;
  ACCESS_DELETE  = $10;
  ACCESS_ATRIB   = $20;
  ACCESS_PERM    = $40;
  ACCESS_ALL	 = ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM;

 function NetShareAdd(servername: pWideChar;
level: DWORD; buf: PBYTE; parm_err: PDWORD): NET_API_STATUS;
				    stdcall; external 'NetAPI32.dll' name 'NetShareAdd';

{Implementação}


procedure TForm1.Button2Click(Sender: TObject);
var
 AShareInfo : PSHARE_INFO_2;
 parmError  : DWORD;
begin
 CreateDir('D:\test_folder');
 AShareInfo := New(PSHARE_INFO_2);
 try
   with AShareInfo^ do
   begin
  shi2_netname := WideString('Test_sharing');
  shi2_type    := STYPE_DISKTREE;
  shi2_remark  := nil;
  shi2_permissions := ACCESS_ALL;
  shi2_max_uses    := DWORD(-1); // Maximum allowed
  shi2_current_uses:= 0;
  shi2_path	    := WideString('D:\test_folder');
  shi2_passwd	  := nil;
   end;
   if (NetShareAdd(nil, 2, PBYTE(AShareInfo), @parmError) <> NERR_SUCCESS)then
 ShowMessage(IntToStr(parmError));
 finally
   FreeMem(AShareInfo, SizeOf(PSHARE_INFO_2));
 end;
end;
{disponivel no torry's delphi page}

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
Ana789

Sim quero criar uma partilha de Windows a partir de um software em Delphi.

Obrigado ApocSantos, já experimentei o seu exemplo, mas ao tentar aceder à pasta partilhada por outro pc dá acesso negado.

Share this post


Link to post
Share on other sites
apocsantos

Bom dia,

Dependendo da versão do Windows, tal como tinha indicado, vão aparecer problemas com a segurança do Windows e com a autenticação. Penso que não se trantando de uma rede onde exista um controlador de dominio e um dominio ActiveDirectory, as maquinas têm de se autenticar umas nas outras. Mas isso são configurações do Windows.

O primeiro teste que eu faria, era deixar a aplicação criar a pasta partilhada e depois em vez de aceder directamente no "My Computer", executar o comando net use \\nome_da_maquina\nome_da_partilha, e ver se a partilha funciona. Se funcionar já se tem um ponto de partida, para resolver o problema, se não funcionar também se fica com um bom ponto de partida para encontrar uma solução.

Cordiais cumprimentos,

Apocsantos

  • Vote 2

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
antseq

Dependendo da versão do Windows, tal como tinha indicado, vão aparecer problemas com a segurança do Windows e com a autenticação. Penso que não se trantando de uma rede onde exista um controlador de dominio e um dominio ActiveDirectory, as maquinas têm de se autenticar umas nas outras. Mas isso são configurações do Windows.

Excelente explicação.

O que quer dizer, que mesmo que funcione no seu (Ana789) ambiente de produção, com o seu Windows, com os seus computadores, com a sua rede (c/ ou s/ domínio) pode não ser 100% garantido que funcione em todas as situações, visto que vai depender do sistema e configurações do cliente final.

Não sei qual será o objectivo de criar a tal partilha, mas se fosse eu deixava a parte de criar a partilha para um procedimento "manual" de instalação, dependendo do Windows (ou vários Windows de versões diferentes que o cliente tenha instalado no seu parque de máquinas).

  • Vote 1

Share this post


Link to post
Share on other sites
Gilson Nunes

Excelente explicação.

O que quer dizer, que mesmo que funcione no seu (Ana789) ambiente de produção, com o seu Windows, com os seus computadores, com a sua rede (c/ ou s/ domínio) pode não ser 100% garantido que funcione em todas as situações, visto que vai depender do sistema e configurações do cliente final.

Não sei qual será o objectivo de criar a tal partilha, mas se fosse eu deixava a parte de criar a partilha para um procedimento "manual" de instalação, dependendo do Windows (ou vários Windows de versões diferentes que o cliente tenha instalado no seu parque de máquinas).

concordo!

Share this post


Link to post
Share on other sites
Jessé Gestin

Boa noite,

Se queres criar uma utilizando a implementação que o MS Windows traz, do protocolo SMB, vais ter algumas dificuldades a lidar com previlégios necessários à tua aplicação.

Se procurares bem, vais ver que encontras algumas implementações que funcionam, pelo menos no Windows 7.

type
SHARE_INFO_2 = record
  shi2_netname : pWideChar;
  shi2_type	: DWORD;
  shi2_remark  : pWideChar;
  shi2_permissions : DWORD;
  shi2_max_uses	: DWORD;
  shi2_current_uses: DWORD;
  shi2_path		: pWideChar;
  shi2_passwd	  : pWideChar;
end;
PSHARE_INFO_2 = ^SHARE_INFO_2;
const
  NERR_SUCCESS   = 0;
  STYPE_DISKTREE = 0;
  STYPE_PRINTQ   = 1;
  STYPE_DEVICE   = 2;
  STYPE_IPC	  = 3;
  ACCESS_READ	= $01;
  ACCESS_WRITE   = $02;
  ACCESS_CREATE  = $04;
  ACCESS_EXEC	= $08;
  ACCESS_DELETE  = $10;
  ACCESS_ATRIB   = $20;
  ACCESS_PERM	= $40;
  ACCESS_ALL	 = ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM;

 function NetShareAdd(servername: pWideChar;
level: DWORD; buf: PBYTE; parm_err: PDWORD): NET_API_STATUS;
					stdcall; external 'NetAPI32.dll' name 'NetShareAdd';

{Implementação}


procedure TForm1.Button2Click(Sender: TObject);
var
 AShareInfo : PSHARE_INFO_2;
 parmError  : DWORD;
begin
 CreateDir('D:\test_folder');
 AShareInfo := New(PSHARE_INFO_2);
 try
with AShareInfo^ do
begin
  shi2_netname := WideString('Test_sharing');
  shi2_type	:= STYPE_DISKTREE;
  shi2_remark  := nil;
  shi2_permissions := ACCESS_ALL;
  shi2_max_uses	:= DWORD(-1); // Maximum allowed
  shi2_current_uses:= 0;
  shi2_path		:= WideString('D:\test_folder');
  shi2_passwd	  := nil;
end;
if (NetShareAdd(nil, 2, PBYTE(AShareInfo), @parmError) <> NERR_SUCCESS)then
 ShowMessage(IntToStr(parmError));
 finally
FreeMem(AShareInfo, SizeOf(PSHARE_INFO_2));
 end;
end;
{disponivel no torry's delphi page}

Cordiais cumprimentos,

Apocsantos

Muito bom seu post!

Estou com um erro:

[DCC Error] Unit27.pas(95): E2003 Undeclared identifier: 'NET_API_STATUS'

Alguma dica ? Estou tentando compartilhar uma pasta na rede, via linha de código Delphi

Abraços !

Share this post


Link to post
Share on other sites
nunopicado

Muito bom seu post!

Estou com um erro:

[DCC Error] Unit27.pas(95): E2003 Undeclared identifier: 'NET_API_STATUS'

Alguma dica ? Estou tentando compartilhar uma pasta na rede, via linha de código Delphi

Abraços !

Experimenta incluir esta unit: http://svn.nldelphi.com/nldelphi/opensource/ngln/NetAPI.pas

(precisarás da dll netapi32.dll: http://download.dll-files.com/8ce1a6d16b9077e91e192499eb611c5f/netapi32.zip?0WLgUBYKkO)

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Jessé Gestin

Boa tarde !

Muito obrigado pela reposta e pela atenção....

O erro ainda permanece... Teria como demonstrar como alterar a permissão de compartilhamento da pasta ??

Pois a alteração em permissões na aba de segurança para os usuários logados na máquina, eu consegui alterar, adicionar, remover.

Mais as permissões para o compartilhamento não, apenas consigo compartilha a pasta e visualizar... usando de outros comandos....

Obrigado, no aguardo!!

Share this post


Link to post
Share on other sites
nunopicado

Eu nunca usei isto, não te sei dizer pormenores. O ApocSantos é que talvez saiba.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.