Introdução
Tabelas
Relacionamentos
 Consultas
Formulários
 Relatórios
 Macros
Módulos
ActiveX
 AutomaçãoOLE
 Gráficos
 DAO
 SQL
 Segurança
Redes/ODBC
 Dicas
 Curso Online
Wizards
Ferramentas
Help
 Downloads
 Links
Novidades
FAQs
Index

REDES


Rede Windows 95/98 *

Como Obter o Número IP de uma Máquina e o Número da Placa de Rede *

Login Name *

Recebendo O Logon Da Rede *

Ocultar qualquer diretorio compartilhado *

BD EM REDE *

Rotina para pegar o Nome do usuário da rede *

Comentários Sobre BDs no Access *

Como saber o "Login Name" do usuário corrente *

ODBC
 

Rede Windows 95/98

Numa rede windows 95/98, deve-se lembrar de habilitar o Compartilhamento Completo no micro onde está o sistema, para que funcione adequadamente.
 
 

Como Obter o Número IP de uma Máquina e o Número da Placa de Rede

Voce pode usar a propriedade localip

do objeto winsock

basta inclui-lo em seu projeto.
 
 

Login Name

Como saber o "Login Name" do usuário corrente

Aplicativos: Visual Basic 3.0 32bits, Visual Basic 5.0, Office 95 e 97.

Introdução

Muitos sistemas possuem um módulo de segurança, onde os usuários cadastrados se identificam com seu "User Name" e uma senha para que o sistema possa saber as permissões de cada um dos usuários.

Se o ambiente onde o sistema estiver sendo executado for de rede, é possível aproveitar o login da rede para saber quem é o usuário. Desta forma, o usuário não necessita se identificar na entrada do sistema. Para saber qual o usuário corrente, é usada uma função da API do Windows chamada GetUserName.

Como Fazer?

Para usar a função GetUserName, é necessário declará-la com a seguinte sintaxe:

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Como pode ser visto, esta função possui 2 parâmetros: lpBuffer, que é a variável que receberá o "login name" e nSize, que é o tamanho em bytes da váriavel que receberá o "login name".

Se a função retornar zero, o processo falhou, caso contrário, está tudo OK.

Exemplo:

Function NomeUsuario()

Dim strNomeUsuario As String

Dim lngTamanhoString As Long

Dim lngRetorno As Long

lngRetorno = GetUserName(strNomeUsuario, lngTamanhoString)

If lngRetorno <> 0 then

strNomeUsuario = String(lngTamanhoString, " ")

lngRetorno = GetUserName(strNomeUsuario, lngTamanhoString)

strNomeUsuario = Left$(strNomeUsuario, lngTamanhoString - 1)

NomeUsuario = strNomeUsuario

Else

MsgBox "A busca do Nome do Usuário falhou!!!"

End If

End Function

Vamos analisar alguns pontos importantes deste exemplo:

Como visto, a função foi chamada duas vezes. Isto é feito para primeiramente saber o tamanho da string que deve ser passada. Este tamanho é retornado na variável passada (lngTamanhoString). Sabendo este tamanho, basta preencher a string que receberá o "login name":

strNomeUsuario = String(lngTamanhoString, " ")

Quando tudo ocorre normalmente, basta em seguida usar o número retornado pela função na variável de tamanho, que corresponde ao tamanho da string com o caractere nulo terminal. Como não desejamos o caractere nulo terminal pegamos todos menos ele:

strNomeUsuario = Left$(strNomeUsuario, lngTamanhoString - 1)

Conslusão

Tendo o "login name", basta pegar as permissões armazenadas normalmente em um banco de dados com todos os "login names" cadastrados.
 
 

Recebendo O Logon Da Rede

Retrieving the network logon name

You can easily retrieve a user's network logon name by using the following

API call:

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _

(ByVal lpBuffer As String, nSize As Long) As Long

To retrieve a "clean" version of the name, use this function:

Public Function NTDomainUserName() As String

Dim strBuffer As String * 255

Dim lngBufferLength As Long

Dim lngRet As Long

Dim strTemp As String

lngBufferLength = 255

lngRet = GetUserName(strBuffer, lngBufferLength)

strTemp = UCase(Trim$(strBuffer))

NTDomainUserName = Left$(strTemp, Len(strTemp) - 1)

End Function
 
 

SISTEMA "MODAL"

No VB4 - 16bits eu utilizava uma api da dll USER chamada SetSysModal que fazia com que a sua aplicação se tornasse MODAL e impedisse o uso de outras aplicações (ou seja o usuário não pode utilizar ALT+TAB nem CTRL+ESC nem utilizar outro programa do windows enquanto não sair da minha aplicação). Preciso disso pois a máquina só poderá ser liberada após uma verificação de senha e SmartCard.

Alguém sabe como fazer algo semelhante com alguma API de 32 bits no VB5 ? (a máquina do smartcard só trabalha em 32bits...)

-------

Meu amigo,

Estive desesperado tentando conseguir a mesma coisa no windows 95; mas o que me impediu foi justamente o fato de que o Windows 95 é um sistema operacional multitarefa preemptiva, o que significa que nenhuma aplicação pode estar de fato funcionando 'modal'. Podemos ter janelas 'modal' dentro de um contexto de processo em execução, mas não no sistema todo.

Se o objetivo é parar tudo e fazer com que o usuário fique obrigado a usar um comando, como por exemplo uma janela de login com senha, o jeito é esconder a barra de tarefas, limitar a area de movimento do mouse na tela e manipular a entrada do teclado, tudo isso via API. O caso é que estou estudando essas 3 formas, sendo que a primeira já consegui como fazer. Divino Junior

dribeiro-fct@unimar.br

-------

Estou meio sem tempo para procurar uma solução elegante para o problema, mas a segunda parte de limitar a área de movimento do mouse na tela eu já tinha pronta.

Qualquer dúvida, é só perguntar.

Até mais,

Kleber.

PS.: duas observações para quem se interessar pela rotina:

1ª- Tentei usar uma 'MsgBox' depois de chamar a 'ClipCursor' e a MsgBox soltou o mouse! :-o

2ª- Diz o help da API que para soltar o mouse é só mandar 'ClipCursor' com NULL como parâmetro.

Como em VB para se usar NULL é só usar o zero, tentei fazer

Temp = ClipCursor(0)

mas não obtive sucesso... Se alguém conseguir isto, por favor não se esqueça de me contar como fez. :-)

Option Explicit

'ClipCursor confina o cursor em um retângulo na tela '(as coordenadas são determinado na estrutura 'RECT')

Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long

Private Type RECT

left As Long

top As Long

right As Long

bottom As Long

End Type

Private Sub Form_Click()

Static Flag As Boolean

Dim X As RECT, Temp As Long

'Maximiza a tela, pois se o cursor for confinado em um local 'fora da janela, você não conseguirá mais soltá-lo! :-)

Me.WindowState = 2

'Flag varia entre falso e verdadeiro a cada click 'Ou seja, um click no form confina o mouse; outro click solta-o

If Flag Then

'Cria um retângulo com o tamanho total da tela (e assim libera

o mouse)

X.top = 0: X.left = 0

X.bottom = Screen.Height / Screen.TwipsPerPixelY

X.right = Screen.Width / Screen.TwipsPerPixelX

Else

'Confina o cursor nas seguintes coordenadas

X.top = 300: X.left = 300

X.bottom = 400: X.right = 500

End If

'Chama a função; se o valor de retorno for diferente de zero, 'significa que a função foi bem sucedida

Temp = ClipCursor(X)

Flag = Not Flag

End Sub

--------

Bom, já que tá todo mundo no mesmo barco eu acabei achando uma solução interessante e já vou passar para os outros interessados...

descobri que existe uma função no User32 chamada SystemParametersInfo que diz ao windows95 ou NT que um Screen Saver está ativo e, com isso, desabilita o ALT+TAB, CTRL+ESC e CTRL+ALT+DEL. funciona assim:

Private Const SPI_SCREENSAVERRUNING = 97&

Private Declare Function SystemParametersInfo Lib "User32" Alias

"SystemParametersInfoA" _

(ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any,

ByVal fuWinIni As Long) _

As Long

Para ativar, no load ou no activate da tela, coloque o seguinte código:

Dim lngRet As Long

Dim blnOld As Boolean

lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, blnOld, 0&)
 
 

Para Desativar o código é:

Dim lngRet As Long

Dim blnOld As Boolean

lngRet = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, blnOld, 0&)

Eu testei e pode ter certeza de que funciona mesmo no win95 e no NT.

Luis Serpa

-------

Ok, gente. Ja consegui colocar minha aplicacao MODAL presa sem que o usuario possa mudar com ALT+TAB, mas agora eu tenho outro problema:

Depois que o usuario coloca a senha eu libero a maquina para uso e gostaria de impedir que algum desavisado saisse mexendo ou apgando diretorios do HD da maquina. existe alguma maneira de TRAVAR o explorer ou impedir que arquivos sejam deletedados ou impedir o acesso a determinados diretorios ? Por favor se alguem souber... Luis Serpa

---------

Tem sim.

Vai te dar um pouco de trabalho fazer o VB enxergar o conteudo do diretorio. Coloque um caracter Chr(254) no nome do arquivo... e ninguem vai poder acessar o diretorio via Windows (tem que criar o diretorio via DOS caso contrario nao funciona) . Mas via DOS qualquer um pode dar um Deltree e apagar tudo. Essa e uma dica velha ... mas quando nao se tem escolha, nao se pode mudar de OS...

Agora uma coisa mais legal... Se voce estiver trabalhando em uma rede Win95 voce pode

Ocultar qualquer diretorio compartilhado

va ate as propriedades do compartilhamento e coloque um $ no fim do nome como o diretorio que vai ser compartilhado. O diretorio continua sendo acessivel com as mesmas propriedades e senhas que voce definiu... porem agora ele nao aparece em nenhuma lista do Windows.

Para entrar no diretorio so digitando o caminho completo: \\maquina\pasta$\ legal ne? Eu uso esse recurso para ninguem deletar acidentalmente os arquivos da agencia de correio eletronico e o .MDB do meu programa. Boa sorte! CRG

net.runner@u-netsys.com.br
 
 
 
 

BD EM REDE

>O que esta acontecendo é o seguinte.

>Eu sei que quanto mais usamos um arquivo .MDB ele costuma ficar um pouco maior devido a dados temporários que o Jet Database grava no próprio MDB. Para remover estes dados é só compactar o banco de dados pelo Access ou pelo método CompactDatabase.

>Mas o meu banco de dados esta ficando grande demais... chegando a atingis 6.5Mb com apenas 2 ou 3 usuários trabalhando "para valer" no banco de dados.

>Minha pergunta é... isso é normal? Nas outras versões no Jet DataBase o MDB não ficava tão grande assim.

>O MDB praticamente dobrou de tamanho só de dados temporários. Como vai ficar quando eu tiver 10 ou 15 funcionários usando o sistema ao mesmo tempo?!

>Obrigado a todos da lista.

--------

Oi Albuquerque.

Em primeiro lugar obrigado pela atenção.

Esta nos meus planos migrar para o NT no futuro e uma base de dados mais consistente.

O que esta me espantando no caso desse MDB é que em outra empresa eu criei um sistema similar usando o Access2 e nessa empresa havia tabelas com muito mais registros (25000) e também muito mais usuários (16 ao todo) e o MDB não era maior que 10Mb. Como que essa tecnologia pode ter involuído no Access97?!

Obrigado a todos!

Cesar R. Gimenes

---------

Se voce esta´ pensando em ter mais do que 10 usuarios simultaneos, talvez a melhor solucao seja usar o SQL SERVER. Ele monta tabelas com acesso muito rapido, mesmo que o banco (muito menor que o MDB) tenha 300, 400 Mb.

Por exemplo, eu tenho um banco com mais de 50 tabelas, sendo a maioria com menos de 500 registros, duas com 12.000 e uma, especificamente, com mais de 100 mil registros, e tudo junto ocupa cerca de 330 Mb no servidor. Utilizo esta solucao (Servidor NT 4.0 + SQL Server) para 22 usuarios simultaneos, e um banco bem pesado. A performance e´ muito boa.

Ter uma tabela como esta no formado MDB e´ suicidio. Voce esta´ muito sujeito a problemas. Quando voce tiver 15 funcionarios atualizando a tabela simultaneamente, voce tera´ muitos problemas de perda de integridade, por que o formato MDB nao funciona muito bem com um compartilhamento pesado como este.

Outra solucao seria utilizar um formato de arquivo intermediario entre o MDB e o SQL SERVER. Por exemplo, InterServer.

Atencisoamente,

Sergio A. Albuquerque

Obs.: estas mensagens foram da lista de VB da virtualand: http://www.virtualand.net/

Rotina para pegar o Nome do usuário da rede

Origem:

Alessandro

E-mail:

Testado na versão:

7.0

Comentários:

A rotina além de funcionar com sucesso nas redes Novell e Windows NT

também obteve bom desempenho em redes Windows 95.

Passos:

1 - Crie um novo módulo e coloque as seguintes linhas:

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As

String, nSize As Long) As Long

Public ret As Long

Public Usuário As String

2 - Salve o módulo com qualquer nome;

3 - No formulário que você tem como o primeiro a ser aberto junto com o banco de dados crie

um campo com o nome "UserID" e, no evento Ao Abrir do formulário, coloque a seguinte rotina:

Dim X As String

'captura o nome do usuario logado na rede

Usuário = String(255, 0)

ret = GetUserName(Usuário, Len(Usuário))

'elimina os nulos da variavel Usuário

X = 1

Do While Asc(Mid(Usuário, X, 1)) <> 0

X = X + 1

Loop

Usuário = Left(Usuário, (X - 1))

UserID = Usuário
 
 

Access 97 em rede: com quantos micros ele tem capacidade de trabalhar?

>

> Ouvi um boato de que o Access 2 (na época) trabalhava com pequenas redes

> de ate 11 micros, mas não tenho certeza e no Access 97 talvez seja

> diferente!
 
 

Dividindo-se o banco de dados em dois (Back-End e Front-End) até 20 estações

roda sem problemas, desde que suas tabelas não sejem extensas em volume de

dados. Já tive a experiência em implantar sistemas nesta configuração em

Access97.

No Access2000 com a inclusão do acesso à base de dados em SQL7 este limite

praticamente não existe.
 
 

Abraços,

Vagner Izaias Ferreira

Vagner'Soft Informática Ltda.

--------

Assunto:

Re: Com quantos micros o Access97 pode trabalhar em rede?

Data:

Tue, 21 Dec 1999 09:57:38 -0200

De:

"Juninho" <shopcomp@zaz.com.br>

Para:

"Ribamar FS" <ribafs@yahoo.com>
 
 

O Access 97 comporta senão me engano até 25 computadores em rede.
 
 

Comentários Sobre BDs no Access

Não seria o caso de vc pensar em migrar para SQL SERVER??

Sim...

O problema é que o CEO da empresa exigiu que eu usasse o Access97. Nem trabalhar com o VB5 (que é a minha vontade) eu posso. Bom o jeito foi montar tudo no próprio Access, o programa esta ficando legal embora um pouco lento nas maquinas mais desmemoriadas. A única deficiência que eu encontrei programando no Access é que ele não pode usar o operador AddressOf que no VB é usado para fazer os famosos CallBacks. ...Única deficiência alem das que eu já esperava :-)... Por enquanto não tive problemas de banco de dados corrompido ou truncado (para falar a verdade eu tinha muito desse tipo de problema nos velhos tempos do Clipper)

>Eu tenho um caso em que fui forçado a mudar... Usando apenas MDB, o BD se corrompia a toda hora, e isso não acontece mais usando o SQL SERVER. >A configuração nesse caso era para 10 usuários. Além do mais, o SQL SERVER dá muito mais opções.

Sim eu acho uma boa.

O problema é que até isso passar pela etapa de O&M vai levar no mínimo um ano.

>Sugiro que vc dê uma olhada na edição desse mês da revista FORUM ACCESS.

Legal ... Vou sim!

Quanto ao tamanho do banco de dados, cada vez que eu adiciono um usuário ele fica mais obeso, ainda mais agora que eu tenho um usuário trabalhando remotamente via rede Dial-Up. (Deus tenha piedade da minha alma)

Obrigado Takahashi!

Obrigado também a todos os amigos das listas. Cesar R. Gimenes

net.runner@u-netsys.com.br
 
 

Como saber o "Login Name" do usuário corrente

Aplicativos: Visual Basic 3.0 32bits, Visual Basic 5.0, Office 95 e 97.

Introdução

Muitos sistemas possuem um módulo de segurança, onde os usuários cadastrados se identificam com seu "User Name" e uma senha para que o sistema possa saber as permissões de cada um dos usuários.

Se o ambiente onde o sistema estiver sendo executado for de rede, é possível aproveitar o login da rede para saber quem é o usuário. Desta forma, o usuário não necessita se identificar na entrada do sistema. Para saber qual o usuário corrente, é usada uma função da API do Windows chamada GetUserName.

Como Fazer?

Para usar a função GetUserName, é necessário declará-la com a seguinte sintaxe:

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Como pode ser visto, esta função possui 2 parâmetros: lpBuffer, que é a variável que receberá o "login name" e nSize, que é o tamanho em bytes da váriavel que receberá o "login name".

Se a função retornar zero, o processo falhou, caso contrário, está tudo OK.

Exemplo:

Function NomeUsuario()

Dim strNomeUsuario As String

Dim lngTamanhoString As Long

Dim lngRetorno As Long

lngRetorno = GetUserName(strNomeUsuario, lngTamanhoString)

If lngRetorno <> 0 then

strNomeUsuario = String(lngTamanhoString, " ")

lngRetorno = GetUserName(strNomeUsuario, lngTamanhoString)

strNomeUsuario = Left$(strNomeUsuario, lngTamanhoString - 1)

NomeUsuario = strNomeUsuario

Else

MsgBox "A busca do Nome do Usuário falhou!!!"

End If

End Function

Vamos analisar alguns pontos importantes deste exemplo:

Como visto, a função foi chamada duas vezes. Isto é feito para primeiramente saber o tamanho da string que deve ser passada. Este tamanho é retornado na variável passada (lngTamanhoString). Sabendo este tamanho, basta preencher a string que receberá o "login name":

strNomeUsuario = String(lngTamanhoString, " ")

Quando tudo ocorre normalmente, basta em seguida usar o número retornado pela função na variável de tamanho, que corresponde ao tamanho da string com o caractere nulo terminal. Como não desejamos o caractere nulo terminal pegamos todos menos ele:

strNomeUsuario = Left$(strNomeUsuario, lngTamanhoString - 1)

Conslusão

Tendo o "login name", basta pegar as permissões armazenadas normalmente em um banco de dados com todos os "login names" cadastrados.
 
 

Utilizar o VB com banco de dados do MS Access em ambiente multiusuário

Resposta do Marcus Vinícius: Normalmente. Para o MsAccess é indiferente se você está utilizando acesso multiusuário ou não. Você deve tomar cuidado, somente com os comandos de rede. tais como:

Commit, Trans - Para efetivar / Rollback - Para desfazer / On error – para tratar erros de acesso e semelhantes.
 


1