GARANTIR DESCONTO

Fórum Pasta compartilhada e com permissão #615843

25/05/2021

0

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

Responder

Posts

16/06/2021

Anderson Ferreira

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?
Responder

Gostei + 0

17/06/2021

Natanael Ferreira

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');
Responder

Gostei + 0

17/06/2021

Anderson Ferreira

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á?
Responder

Gostei + 0

17/06/2021

Natanael Ferreira

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar