DETECTAR LEITOR VIA CODIGO
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.
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.
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.
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
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
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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)
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)
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??
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??
Tópico encerrado , respostas não são mais permitidas