segunda-feira, 7 de dezembro de 2009

Recriando Base de dados do WMI

Em uma base com muitos clientes do SCCM algumas vezes ocorre de os clientes não estarem realizando corretamente o inventário de hardware, isso muito vezes acontece por que a base do WMI da estação esta corrompida. Ha diversos metodos de reparar esta base, mas o que funciona quase 100% das vezes é a recriação da base WMI. Mas como saber quais os clientes que não estão realizando o inventário de hardware corretamente??
Podemos utilizar o próprio relatório do SCCM (Clients that have not reported recently (in a specified number of days) ID 140) ou por um método que eu creio ser mais facil, criar uma collection e olhar direto na console, através do seguinte query sql:


select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_COMPUTER_SYSTEM on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId where SMS_G_System_COMPUTER_SYSTEM.Name not in (select SMS_R_System.Name from SMS_R_System inner join SMS_G_System_WORKSTATION_STATUS on SMS_G_System_WORKSTATION_STATUS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_WORKSTATION_STATUS.LastHardwareScan >= DateAdd(dd,-xx,GetDate()) ) or SMS_G_System_COMPUTER_SYSTEM.Name not in (select SMS_R_System.Name from SMS_R_System inner join SMS_G_System_LastSoftwareScan on SMS_G_System_LastSoftwareScan.ResourceID = SMS_R_System.ResourceId where SMS_G_System_LastSoftwareScan.LastScanDate >= DateAdd(dd,-xx,GetDate()))

Lembrando que os caracteres xx devem ser alterados com a numero de dias maximo a ser usado, se colocarmos 10, aparecerão todas as estações que não estão com o relatório de hardware e software feito nos ultimos 10 dias.


Com o report ou a collection prontos mãos a obra.

Eu particularmente costumo trabalhar muito com a suite de aplicativos psexec, que permite aos admins executarem comandos em estações de trabalho remotamente (isso por ser mais rapido, mas essa questão pode ser resolvida usando um package pelo proprio sccm, por exemplo executando o arquivo de lotes (bat) que sera mostrado a seguir, para rodar por exemplo uma vez por dia na collection de estações onde não esta sendo realizado o inventário de hardware) eu costumo usar o psexec por que se eu recrio a base WMI uma vez e o relatório não é realizado isso significa que o problema é outro, e não o WMI (cliente não instalado, ou não esta atualizando as politicas do sccm como deveria).

Sem mais delongas vamos ao script, que é muito simples mas funcional.
=========================================================================================
Net Stop ccmexec /y
Net Stop WinMgmt /y
cd \
cd windows\system32\wbem
ren Repository Repository_old
Net Start WinMgmt /y
Net Start ccmexec /y

=========================================================================================

Salve o conteudo em um arquivo .bat


abra o command

cd \caminho da pasta extraida do psexec\

crie um arquivo de texto com os computadores listados na collection de computadores não inventariados nos ultimos xx dias (pode ser feito na propria console do sccm view > export list ), salve esse arquivo no mesmo diretorio do psexec


e execute o seguinte comando

psexec @nomedoarquivo.txt -s \\caminhodoarquivobat


O psexec então buscará todos os nomes dos computadores da lista e irá executar o bat neles, recriando então o repositóio do WMI.

sexta-feira, 4 de dezembro de 2009

Inventário de Memória

Como primeiro post do blog irei falar um pouco sobre um problema que obtive logo que comecei a fazer relatórios no SCCM. Para realizar um estudo de upgrade do parque tecnológico necessitamos saber quais as configurações atuais do parque, mas mais especificamente quanto possuem de memória as estações e se é possivel realizar upgrade. Pra isso precisamos saber também quantos slots fisicos a placa-mãe possui e quantos encontran-se em uso.

Após algum estudo encontrei as Classes do WMI que realizam este levamentamento.

São elas

Physical_Memory_Array

Que nos indica quantos Slots Fisicos cada Placa-mãe possui através da instancia
MemoryDevices

Physical_Memory_Location

Que nos indica qual a velocidade real da memória (os indicados em alguns relatórios do System Center nos mostram a memória em uso, por exemplo se 8 MBs estão compartilhados para placa de vídeo ele mostra em uma memória de 512 como 504, as vezes isso prejudica um levantamento oficial caso haja algum caso de memória compartilhada de 128 ou mesmo 256 para vídeo. Esta fica representada pela instancia
Capacity nesta mesma classe.


Bom entendido o que faremos mãos a obra.

Antes de tudo devemos realizar um backup do arquivo sms_def.mof que encontra-se no seguinte caminho

\\servidor\sms_seusite\inboxes\clifiles.src\hinv\

após ter realizado o backup devemos edita-lo, inserindo os parametros abaixo no final do arquivo

=========================================================================================

//*******************************************************************************
// Adicionar Clasesse de Report Physical Memory Location e Physical Memory Array
// para realizar reports de quantidade de bancos por estação
//
//*******************************************************************************


#pragma namespace("\\\\.\\ROOT\\CIMV2\\SMS")
#pragma deleteclass("win32_PhysicalMemory",NOFAIL)

[ SMS_Report (TRUE),
SMS_Group_Name ("Physical Memory Array"),
SMS_Class_ID ("MICROSOFT|Physical_Memory_Array|1.0")]
class Win32_PhysicalMemoryArray : SMS_Class_Template
{
[SMS_Report(TRUE)] uint16 MemoryDevices;
};



// <:[-<>>>>>>>>>>>>>>>>>>>>>>>>>>>Start>>-Physical Memory Location-<-]:>
[SMS_Report (TRUE),
SMS_Group_Name ("Physical Memory Location"),
SMS_Class_ID ("Microsoft|Physical_Memory_Location|1.0")]

Class Win32_PhysicalMemory : SMS_Class_Template
{
[SMS_Report (TRUE)] string BankLabel;
[SMS_Report (TRUE), SMS_Units("Megabytes")] uint64 Capacity;
[SMS_Report (TRUE)] string Caption;
[SMS_Report (TRUE)] string DeviceLocator[];
[SMS_Report (TRUE)] uint16 FormFactor;
[SMS_Report (TRUE)] string Manufacturer;
[SMS_Report (TRUE)] uint16 MemoryType;
[SMS_Report (TRUE)] uint32 PositionInRow;
[SMS_Report (TRUE)] uint32 Speed;
[SMS_Report (TRUE),Key] string Tag;
[SMS_Report (TRUE),Key] string CreationClassName;
};
// <:[-<>>>>>>>>>>>>>>>>>>>>>>>>>>>END>>-Physical Memory Location-<-]:>
=========================================================================================

Fica a critério de cada um se vão tornar as demais instancias da classe true ou false para gerar junto ou não nos relatórios, eu ja coloquei por padrão pois quando necessitar de mais alguma info referente a memória sei que as mesmas estãrão disponíveis.

Feito isso basta aguardar o sccm publicar estas informações e os proximos inventários de hardware ja estarão salvando informações referentes aos bancos de memória.

Para testar experimente abrir o resource explorer de um computador e verificar se apareceram as duas classes adicionais no inventário de hardware.




Serão criadas tambem duas views no banco de dados do sccm, então quando for criar os relatórios pode usá-las, são elas:

v_GS_PHYSICAL_MEMORY_LOCATION
v_GS_PHYSICAL_MEMORY_ARRAY


Ficamos por aqui com o assunto memória por hoje, espero que todos tenham gostado.

Obrigado