Pasta compartilhada e com permissão

Delphi

25/05/2021

Olá amigos, gostaria de sabe se alguém tem uma solução para um problema que estou tendo. Meu sistema acessa uma pasta compartilhada no servidor, ex.: \\servidor\pastasistema$\, acontece que essa pasta tem senha e usuário para acessar. Gostaria de saber como que faço para meu sistema se conectar, deixaria uma senha e senha salva dentro do sistema e assim não importa que esteja conectado no PC meu sistema teria acesso a essa pasta e o usuário pelo windows, fora do sistema, ainda não teria acesso. Desde já agradeço a ajuda de todos.
Anderson Ferreira

Anderson Ferreira

Curtidas 0

Respostas

Anderson Ferreira

Anderson Ferreira

25/05/2021

Olá amigos, gostaria de sabe se alguém tem uma solução para um problema que estou tendo. Meu sistema acessa uma pasta compartilhada no servidor, ex.: \\\\servidor\\pastasistema$\\, acontece que essa pasta tem senha e usuário para acessar. Gostaria de saber como que faço para meu sistema se conectar, deixaria uma senha e senha salva dentro do sistema e assim não importa que esteja conectado no PC meu sistema teria acesso a essa pasta e o usuário pelo windows, fora do sistema, ainda não teria acesso. Desde já agradeço a ajuda de todos.



up!!!! alguém para ajudar?
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

25/05/2021

Precisei disso e custei a resolver.

Você precisar fazer um mapeamento oculto (sem letra de unidade).

O programa terá acesso a pasta mas não ficará visível como unidade de rede no Windows.

Testa aí.

procedure MapearUnidadeRedeOculta(pasta, usuário, senha: string);
var
  NRW: _NETRESOURCEW;
  dwResult: DWORD;
  S: string;
begin
  with NRW do
  begin
    dwType := RESOURCETYPE_DISK;
    lpLocalName := nil;  // não adiciona letra (oculta a unidade no windows)
    lpRemoteName := PCHAR(pasta); // caminho para ser mapeado
    lpProvider := nil;
  end;
 
  case WNetAddConnection2(NRW, PCHAR(senha), PCHAR(usuario), CONNECT_UPDATE_PROFILE) of
    NO_ERROR:
      S := EmptyStr;
    ERROR_ACCESS_DENIED:
      S := 'O acesso ao recurso de rede foi negado.';
    ERROR_ALREADY_ASSIGNED:
      S := 'O dispositivo local especificado por lpLocalName já está conectado a um recurso de rede.';
    ERROR_BAD_DEV_TYPE:
      S := 'O tipo de dispositivo local e o tipo de recurso de rede não correspondem.';
    ERROR_BAD_DEVICE:
      S := 'O valor especificado por lpLocalName é inválido.';
    ERROR_BAD_NET_NAME:
      S := 'O valor especificado por lpRemoteName não é aceitável para nenhum provedor de recursos de rede. O nome do recurso é inválido ou o recurso nomeado não pode ser localizado.';
    ERROR_BAD_PROFILE:
      S := 'O perfil do usuário está em um formato incorreto.';
    ERROR_BAD_PROVIDER:
      S := 'O valor especificado por lpProvider não corresponde a nenhum provedor.';
    ERROR_BUSY:
      S := 'O roteador ou provedor está ocupado, possivelmente inicializando. O chamador deve tentar novamente.';
    ERROR_CANCELLED:
      S := 'A tentativa de fazer a conexão foi cancelada pelo usuário por meio de uma caixa de diálogo de um dos provedores de recursos de rede ou por um recurso chamado.';
    ERROR_CANNOT_OPEN_PROFILE:
      S := 'O sistema não pode abrir o perfil do usuário para processar conexões persistentes.';
    ERROR_DEVICE_ALREADY_REMEMBERED:
      S := 'Uma entrada para o dispositivo especificado em lpLocalName já está no perfil do usuário.';
    ERROR_EXTENDED_ERROR:
      S := 'Ocorreu um erro específico da rede. Chame a função WNetGetLastError para obter uma descrição do erro.';
    ERROR_INVALID_PASSWORD:
      S := 'A senha especificada é inválida.';
    ERROR_NO_NET_OR_BAD_PATH:
      S := 'Um componente de rede não foi iniciado ou o nome especificado não pôde ser tratado.';
    ERROR_NO_NETWORK:
      S := 'Não há rede presente.';
    ERROR_SESSION_CREDENTIAL_CONFLICT:
      S := 'Conflito de credencial na sessão.'
  else    
      S := Concat('Erro desconhecido: ', dwResult.ToString());   
  end;
   if S <> EmptyStr then
    MessageDlg(S, mtError, [mbOk], 0);
end;


Exemplo de chamada da procedure:

MapearUnidadeRedeOculta('\\\\servidor\\pastasistema$\\', 'meuUsuario',  'minhaSenha');
GOSTEI 0
Anderson Ferreira

Anderson Ferreira

25/05/2021

Precisei disso e custei a resolver.

Você precisar fazer um mapeamento oculto (sem letra de unidade).

O programa terá acesso a pasta mas não ficará visível como unidade de rede no Windows.

Testa aí.

procedure MapearUnidadeRedeOculta(pasta, usuário, senha: string);
var
  NRW: _NETRESOURCEW;
  dwResult: DWORD;
  S: string;
begin
  with NRW do
  begin
    dwType := RESOURCETYPE_DISK;
    lpLocalName := nil;  // não adiciona letra (oculta a unidade no windows)
    lpRemoteName := PCHAR(pasta); // caminho para ser mapeado
    lpProvider := nil;
  end;
 
  case WNetAddConnection2(NRW, PCHAR(senha), PCHAR(usuario), CONNECT_UPDATE_PROFILE) of
    NO_ERROR:
      S := EmptyStr;
    ERROR_ACCESS_DENIED:
      S := 'O acesso ao recurso de rede foi negado.';
    ERROR_ALREADY_ASSIGNED:
      S := 'O dispositivo local especificado por lpLocalName já está conectado a um recurso de rede.';
    ERROR_BAD_DEV_TYPE:
      S := 'O tipo de dispositivo local e o tipo de recurso de rede não correspondem.';
    ERROR_BAD_DEVICE:
      S := 'O valor especificado por lpLocalName é inválido.';
    ERROR_BAD_NET_NAME:
      S := 'O valor especificado por lpRemoteName não é aceitável para nenhum provedor de recursos de rede. O nome do recurso é inválido ou o recurso nomeado não pode ser localizado.';
    ERROR_BAD_PROFILE:
      S := 'O perfil do usuário está em um formato incorreto.';
    ERROR_BAD_PROVIDER:
      S := 'O valor especificado por lpProvider não corresponde a nenhum provedor.';
    ERROR_BUSY:
      S := 'O roteador ou provedor está ocupado, possivelmente inicializando. O chamador deve tentar novamente.';
    ERROR_CANCELLED:
      S := 'A tentativa de fazer a conexão foi cancelada pelo usuário por meio de uma caixa de diálogo de um dos provedores de recursos de rede ou por um recurso chamado.';
    ERROR_CANNOT_OPEN_PROFILE:
      S := 'O sistema não pode abrir o perfil do usuário para processar conexões persistentes.';
    ERROR_DEVICE_ALREADY_REMEMBERED:
      S := 'Uma entrada para o dispositivo especificado em lpLocalName já está no perfil do usuário.';
    ERROR_EXTENDED_ERROR:
      S := 'Ocorreu um erro específico da rede. Chame a função WNetGetLastError para obter uma descrição do erro.';
    ERROR_INVALID_PASSWORD:
      S := 'A senha especificada é inválida.';
    ERROR_NO_NET_OR_BAD_PATH:
      S := 'Um componente de rede não foi iniciado ou o nome especificado não pôde ser tratado.';
    ERROR_NO_NETWORK:
      S := 'Não há rede presente.';
    ERROR_SESSION_CREDENTIAL_CONFLICT:
      S := 'Conflito de credencial na sessão.'
  else    
      S := Concat('Erro desconhecido: ', dwResult.ToString());   
  end;
   if S <> EmptyStr then
    MessageDlg(S, mtError, [mbOk], 0);
end;


Exemplo de chamada da procedure:

MapearUnidadeRedeOculta('\\\\\\\\servidor\\\\pastasistema$\\\\', 'meuUsuario',  'minhaSenha');



obrigado pela ajuda, mas está danod o erro: Conflito de credencial na sessão.

Pq será?
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

25/05/2021

Nunca tive este erro mas pesquisando encontrei que este erro ocorre quando já tem uma conexão com este recurso já conectado.

Nesta conexão você usou outro nome de usuário e depois o que você usa agora.

Para resolver você deve usar o mesmo nome de usuário usado com a conexão anterior, ou você desconecta a primeira conexão.

Veja alguns links (em inglês):

http://www.delphigroups.info/2/38/502366.html
http://www.delphigroups.info/2/87/473919.html
GOSTEI 0
POSTAR