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 *
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.
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.
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
>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.