DETECTAR LEITOR VIA CODIGO

ARCADYUM 24/02/2013 19:36:34
#419584
Pessoal,
Alguém possue algum código que consiga detectar o leitor de cd/dvd instalado no computador.
Aproveitando é possível detectar o mouse e o teclado também??
Desde já agradeço pela atenção.
MJAC 07/04/2013 23:18:07
#421636
estude sobre [txt-color=#0000f0]ManagementObjectSearcher[/txt-color] e conseguirá detectar todos tipos de dispositivos conectados ao computador e todas as informações dos mesmo, não só cd/dvd, como hd, processador, e também dispositivos usb, webcans, scanners, impressoras, leitores biometricos, como também portas seriais, paralelas ou qualquer outro hardware conectado na máquina.
ALEVALE 08/04/2013 08:15:31
#421637
Resposta escolhida
Existem N maneiras descobrir se um CD/DVD está instalado, inclusive utilizando WMI (Windows Management Instrumentation).
Abaixo um outro exemplo que não é via WMI.
Private Function fncCdDvrRom()
Try
Dim cdDrives = From d In IO.DriveInfo.GetDrives() Where d.DriveType = IO.DriveType.CDRom Select d
For Each drive In cdDrives
If drive.Name <> [Ô][Ô] Then
msgbbox(drive.Name & [Ô] - HABILITADO[Ô])
Else
msgbox([Ô]NÃO ENCONTRADO[Ô])
End If
Exit Function
Next
Catch ex As Exception
msgbox(ex.Message.ToString))
End Try
End Function
ARCADYUM 08/04/2013 09:12:41
#421641
Prezados Alevale e Mjac,
Em primeiro lugar obrigado pela atenção. Nos últimos dias tenho pesquisado sobre o WMI e conseguir muitas informações sobre o programa. Realmente é o meio mais rápido que encontrei para levantar as informações que preciso. Porém, neste momento, estou precisando de um codigo que renomeie o computador e o grupo de trabalho. Vi muitos códigos que prometiam fazer isso em WMI, mas nenhum deles funcionou. Alguma idéia??
Obrigado pela atenção.
OCELOT 08/04/2013 09:24:17
#421642
Esses códigos que você viu para renomear o PC e o Grupo de Trabalho você executou como administrador? Pois se o UAC está ativado precisa rodar com permissões elevadas para poder fazer estas alterações
ARCADYUM 08/04/2013 09:41:58
#421644
Ocelot,
Os computadores que trabalho são todos logados como administradores. Todos os testes que realizei com estes códigos que encontrei sequer acionaram o UAC para confirmar a execução do código. Muitas vezes, quando necessito instalar um programa ele solicita a confirmação, neste caso, nem solicitou, nem modificou. Alguma idéia ou procedimento que eu não esteja executando??
Aguardo notícias e obrigado pela atenção.
MJAC 08/04/2013 21:19:43
#421672
Arcadyum os programas criado no vb não pedem permissão de privilégio para executar uma ação que exija isso, o programador precisa especificar na inicialização que precisará solicitar isso através da classe DirectoryInfo.SetAccessControl onde informa o nível de privilégio necessário, para os códigos que encontrou, compile e execute forçadamente como administrador.
OCELOT 09/04/2013 09:06:00
#421674
Como o MJAC disse nenhum código que você criar vai pedir elevação do UAC a menos que você faça isso, qualquer código que precise de elevação rodando em um programa sem elevação vai simplesmente falhar, porém não é pelo método que o MJAC disse, este serve para mudar permissões de pastas, o mesmo que se faz no Explorer na aba Segurança das propriedades da pasta.

Na verdade no .Net não existe nenhuma forma de elevar o programa por código de forma simples com um único comando, e também tem que ver que a elevação de privilégio precisa que o programa seja iniciado com ela, geralmente os programas que pedem por elevação se fecham e abrem de novo com as permissões de administrador.

A forma mais fácil de pedir elevação sempre que o programa iniciar é adicionando um arquivo de manifesto no programa e configurando ele para sempre pedir elevação, e para poder debugar o programa dai no VS.Net vai ser necessário rodar o VS.Net como administrador também.

Uma forma fácil de pedir por elevação é usar um componente Open Source chamado UserAccountControl que está disponível no NuGet, porém é meio complicado debugar o projeto assim pois a elevação reinicia o programa e o debugger é finalizado quando isso ocorre, sem contar que dependendo de que parte do programa você está você vai precisar dar um jeito de saber onde tem que voltar a hora que o programa reiniciar.
ARCADYUM 09/04/2013 12:06:10
#421680
Pessoal,
Muito obrigado pela explicação. Eu tinha em mente que por ser ambiente de desenvolvimento não precisava de elevação. O ambiente por si só seria suficiente para realizar as operações. Acreditava também que por estar conectado como administrador no computador seria suficiente para rodar o código no ambiente sem maiores problemas. Testei um monte de códigos que provavelmente funcionavam e por falta dessa noção perdi muito tempo. Agora eu estou com um outro problema que gostaria que me ajudassem por favor.
O Alevale me indicou esse código para renomear o computador:

Imports System
Imports Microsoft.Win32
Imports System.Management
Imports System.Management.Instrumentation

Try [ô]Remove from Domain

Dim ComputerName as string = [Ô][Ô] [ô]Insert Computer Name Here
Dim ConnectionOpt As New ConnectionOptions()
ConnectionOpt.Authentication = AuthenticationLevel.PacketPrivacy
Console.WriteLine([Ô]Connecting to [Ô] & ComputerName & [Ô] WMI Namespace[Ô])

Dim scope As New ManagementScope([Ô]\\[Ô] & ComputerName & _
[Ô]oot\cimv2[Ô], ConnectionOpt)
scope.Connect()
Console.WriteLine([Ô]Connection Succeeded[Ô])
Dim classInstance As New ManagementObject(scope, _
New ManagementPath([Ô]Win32_ComputerSystem.Name=[ô][Ô] _
& ComputerName & [Ô][ô][Ô]), Nothing)
Dim inParams As ManagementBaseObject = _
classInstance.GetMethodParameters([Ô]unjoindomainorworkgroup[Ô])
Console.WriteLine([Ô]Removing [Ô] & ComputerName & _
[Ô] from Domain and adding to Workgroup[Ô])
inParams([Ô]FunjoinOptions[Ô]) = 1
inParams([Ô]Password[Ô]) = [Ô]xxxxxxxx[Ô] [ô] Password Here
inParams([Ô]UserName[Ô]) = [Ô]xxxxxxxx[Ô] [ô] Local Admin User

Dim outParams As UInt32 = _
classInstance.InvokeMethod([Ô]unjoindomainorworkgroup[Ô], Nothing)
Console.WriteLine([Ô]Removal Succeeded.[Ô])
Catch err As ManagementException
Console.WriteLine([Ô]Removal Failed![Ô])
Console.WriteLine([Ô]Error: [Ô] & err.Message)
End Try

Try [ô]Changes Computer Name
Console.WriteLine([Ô]Connecting to [Ô] & ComputerName & [Ô] WMI Namespace[Ô])
Dim ConnectionOpt As New ConnectionOptions()
ConnectionOpt.Authentication = AuthenticationLevel.PacketPrivacy

Dim scope As New ManagementScope([Ô]\\[Ô] & ComputerName & _
[Ô]oot\cimv2[Ô], ConnectionOpt)
scope.Connect()
Console.WriteLine([Ô]Connection Succeeded[Ô])
Console.WriteLine([Ô]Renaming [Ô] & ComputerName & [Ô] to [Ô] _
& NewComputerName [Ô])
Dim classInstance As New ManagementObject _
(scope, New ManagementPath([Ô]Win32_ComputerSystem.Name=[ô][Ô] & _
ComputerName & [Ô][ô][Ô]), Nothing)

Dim inParams As ManagementBaseObject = _
classInstance.GetMethodParameters([Ô]Rename[Ô])
inParams([Ô]Name[Ô]) = [Ô]NewComputerName[Ô]
inParams([Ô]Password[Ô]) = [Ô]xxxxxxxx[Ô] [ô]Local Admin Password
inParams([Ô]UserName[Ô]) = [Ô]xxxxxxxx[Ô] [ô]Local Admin User

Dim outParams As ManagementBaseObject = _
classInstance.InvokeMethod([Ô]Rename[Ô], inParams, Nothing)
Console.WriteLine([Ô]Rename Successful[Ô])
Catch err As ManagementException
Console.WriteLine([Ô]Rename Failed![Ô])
Console.WriteLine([Ô]Error: [Ô] & err.Message)
End Try

Console.WriteLine([Ô][Ô])
Console.WriteLine([Ô]Workstation Must Be Restarted![Ô])

Funcionou muito bem. Gostaria de saber como faço pra renomear o grupo de trabalho. Tentei com esse mesmo código, porém mudando o método e necas. Não funcionou. Alguma idéia??
Desde já agradeço pela atenção.
ALEVALE 09/04/2013 15:10:08
#421695
Se for somente para renomear o WorkGroup utilize o script abaixo:
Salve ele como .VBS

Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
strDomain = [Ô]TESTE11[Ô]

Set objNetwork = CreateObject([Ô]WScript.Network[Ô])
strComputer = objNetwork.ComputerName
Set objComputer = _
GetObject([Ô]winmgmts:{impersonationLevel=Impersonate}!\\[Ô] & _
strComputer & [Ô]oot\cimv2:Win32_ComputerSystem.Name=[ô][Ô] _
& strComputer & [Ô][ô][Ô])
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _
strPassword, _
strDomain & [Ô]\[Ô] & strUser, _
NULL, _
JOIN_DOMAIN + ACCT_CREATE)
ARCADYUM 09/04/2013 15:57:54
#421699
Alevale,
Agradeço mais uma vez pela atenção. Mas, eu estou querendo o mínimo possível de arquivos fora do programa. Quanto menos scripts fora seria melhor. Alguma outra idéia??
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas