Tuesday, February 28, 2012

Error installing SQL Server 2005 on a Server with Multicore Processor

A counterpart had flagged out that he has hit a roadblock while setting up SQL 2005 server in a clustered environment.
An error as below was found when the installation failed

The SQL Server service failed to start. For more information, see the SQL Server Books Online topics, "How to: View SQL Server 2005 Setup Log Files" and "Starting SQL Server Manually."

It was found that is an issue related to the number of cores in a CPU
The below was done to work around the issue on Windows 2003  and complete the installation

1.            To change the number of logical processors in Windows Server 2003, follow these steps:
a.            Click Start, click Run, type msconfig, and then click OK.
b.            In the System Configuration Utility dialog box, click the BOOT.INI tab.
c.             On the BOOT.INI tab, click Advanced Options.
d.            In the BOOT.INI Advanced Options dialog box, click to select the /NUMPROC= check box.
e.            In the list that is next to the /NUMPROC= check box, click 1, and then click OK.
f.             In the System Configuration Utility dialog box, click OK.
2.            Restart the server.
3.            Install SQL Server 2005.
4.            Install the latest service pack for SQL Server 2005.
5.            Restart the server by using all the processors. To do this, follow these steps:
a.            Click Start, click Run, type msconfig, and then click OK.
b.            In the System Configuration Utility dialog box, click the General tab.
c.             On the General tab, click Normal Startup - load all device drivers and services, and then clickOK.
d.            Restart the server.

More information of methods of workaround can be found in this KB from Microsoft

Wednesday, February 22, 2012

Retrieving SCOM monitor thresholds by Powershell

Part of managing the SCOM infrastructure will include knowing what thresholds are being configured for the countless monitors that are available from the many Management Packs that comes from Microsoft or other vendors.
To compile all these thresholds tying them to their respective counters and monitors proves to be a challenge.
There is some powershell cmdlets that are provided on the Microsoft Site that enables us to do that but the thresholds suck as “Logical Disk Free Space” does not appear in the exported CSV.
The result will be something as per the format in the screenshot below


I have made some amendments to the cmdlet to provide this as below.
Other thresholds that are missing can be added by getting the information of the tag from the management pack xml or using the SCOM Management Pack Authoring console that can be downloaded from http://www.microsoft.com/download/en/details.aspx?id=18222. (Example of the tag for the threshold I added for logical Disk Free Space is as the screenshot below)


PowerShell Cmdlet (To use copy the entire contents and save it as <your filename>.ps1

    function GetThreshold ([String] $configuration)
    {
    $config = [xml] ("<config>" + $configuration + "</config>")
    $threshold = $config.Config.Threshold
    if($threshold -eq $null)
   {
    $threshold = $config.Config.MemoryThreshold
    }
    if($threshold -eq $null)
    {
    $threshold = $config.Config.CPUPercentageThreshold
    }
    if($threshold -eq $null)
    {
    if($config.Config.Threshold1 -ne $null -and $config.Config.Threshold2 -ne $null)
    {
                    $threshold = "Error threshold is: " + $config.Config.Threshold1 + " Warning threshold is: " + $config.Config.Threshold2
    }
    }
    if($threshold -eq $null)
    {
    if($config.Config.ThresholdWarnSec -ne $null -and $config.Config.ThresholdErrorSec -ne $null)
    {
     $threshold = "warning threshold is: " + $config.Config.ThresholdWarnSec + " error threshold is: " + $config.Config.ThresholdErrorSec
    }
    }
if($threshold -eq $null)
{
if($config.Config.SystemDriveErrorPercentThreshold -ne $null -and $config.Config.SystemDriveErrorMBytesThreshold -ne $null -and $config.Config.NonSystemDriveErrorMBytesThreshold -ne $null -and $config.Config.SystemDriveWarningPercentThreshold -ne $null)
{
$threshold = "System Drive Error/Warning(%) is: " + $config.Config.SystemDriveErrorPercentThreshold + "% / " + $config.Config.SystemDriveWarningPercentThreshold + "% System Drive Error/Warning (MB) threshold is: " + $config.Config.SystemDriveErrorMBytesThreshold + "%/ " + $config.Config.SystemDriveWarningMBytesThreshold + ". " + "Non-System Drive Error/Warning (%) is : " + $config.Config.NonSystemDriveErrorPercentThreshold + "% / " + $config.Config.SystemDriveWarningPercentThreshold + "%. " + "% Non-System Drive Error/Warning (MB) threshold is: " + $config.Config.NonSystemDriveErrorMBytesThreshold + "%/ " + $config.Config.NonSystemDriveWarningMBytesThreshold
}
}
    if($threshold -eq $null)
    {
     if($config.Config.LearningAndBaseliningSettings -ne $null)
     {            
      $threshold = "no threshold (baseline monitor)"
    }
    }
    return $threshold
    }
Function GetFrequency ([String] $configuration)
{
$config = [xml] ("<config>" + $configuration + "</config>")
$Frequency = $config.Config.Frequency
if($Frequency -eq $null)
{
$frequency = $config.Config.Frequency;
}
 return ($frequency)
}
Function GetNumsamples ([String] $configuration)
{
$config = [xml] ("<config>" + $configuration + "</config>")
$Samples = $config.Config.Samples
if($Samples -eq $null)
{
$Samples = $config.Config.NumSamples;
}
 return ($Samples)
}
Function GetCounterName ([String] $configuration)
{
$config = [xml] ("<config>" + $configuration + "</config>")
$Counter = $config.Config.Counter
if($Counter -eq $null)
{
$Counter = $config.Config.CounterName;
}
 return ($Counter)
}
Function GetObject ([String] $configuration)
{
$config = [xml] ("<config>" + $configuration + "</config>")
$Object = $config.Config.Object
if($Object -eq $null)
{
$Object = $config.Config.ObjectName;
}
 return ($Object)
}

    $perfMonitors = get-monitor -Criteria:"IsUnitMonitor=1"

$perfMonitors | select-object @{Name="MP";Expression={ foreach-object {$_.GetManagementPack().DisplayName }}},@{name="Target";expression={foreach-object {(Get-MonitoringClass -Id:$_.Target.Id).DisplayName}}},DisplayName,enabled,@{name="Threshold";expression={foreach-object {GetThreshold $_.Configuration}}}, @{name="Frequency";expression={foreach-object {GetFrequency $_.Configuration}}}, @{name="Samples";expression={foreach-object {GetNumSamples $_.Configuration}}}, @{name="Counter";expression={foreach-object {GetCounterName $_.Configuration}}}, @{name="Object";expression={foreach-object {GetObject $_.Configuration}}} | sort Target, DisplayName | export-csv "c:\temp\monitor_thresholds.csv"

Thursday, February 16, 2012

Tracking IM usage in OCS 2007 R2

I could not find something generic that comes out of the box from Microsoft to perform retrieve the usage of Instant Messaging by users in my infrastructure setup for some auditing purposes.
The below is a little SQL query which I have written for the purpose to share.



A sample screenshot of the output is as below



 Declare  @user varchar(50)
Declare @ startdate,@enddate datetime

'Replace usersip with your user's SIP address
Set @user = 'usersip'
'Replace mm/dd/yyyy with appropriate dates
set @startdate = 'mm/dd/yyyy'
set @enddate = 'mm/dd/yyyy'

SELECT [SessionIdTime] as 'StartDate'
        ,[SessionEndTime] as 'EndDate'
      ,user1.UserUri as User1
      ,user2.UserUri as User2
      ,[User1MessageCount]
      ,[User2MessageCount]
     
  FROM SessionDetails

  left join dbo.Users user1 on user1.UserId = User1Id
  left join dbo.Users user2 on user2.UserId = User2Id

Where (datediff(hh, convert(date,SessionIdTime),@enddate)< datediff(hh,@startdate,  @enddate)) and user1.UserUri in (@user)

Wednesday, February 15, 2012

Customized SSRS reporting for SCOM Alerts Breakdown

I was tasked to come up with something that will enable the breakdown of the SCOM alerts by the severity (Critical, Warning, Information) as well as Server Level.
The generic report that comes with SCOM reporting doesn’t seem to be able to provide what is required.
The report was created with the parameters of the year and month which the alerts are generated as well as select the group to query against (SCOM group which we usually use to group servers of a certain role , site etc)
I am using the below SQL query together with SQL Server Reporting Services (SSRS) .
For ease of use for all, I have uploaded the RDL to http://www.mediafire.com/?ve5zoueabbbhd
The output will be  something similar to the below screenshot.

SQL Query

Select
L1.server
,L1.ForestDNSName
,L1.FullName
,L1.AlertName
,L1.priority
,L1.severity
,sum(L1.severitynone) as 'Severity None Count'
,sum(L1.severitywarning) as 'Severity Warning Count'
,sum(L1.severityCritical) as 'Severity Critical Count'
,L1.triggermonth
,L1.triggeryear
from
(
select      AlertName as 'Alertname'
,ars.DWCreatedDateTime as 'createdDateTime'
,apy.Priority as 'Priority'
,asy.severity as 'Severity'
,case when (asy.Severity = 'Warning' and RepeatCount =0) then 1
when (Asy.Severity = 'Warning' and RepeatCount >0) then RepeatCount
else 0
end as 'SeverityWarning'
,case when (asy.Severity = 'Critical' and RepeatCount =0) then 1
when (Asy.Severity = 'Critical' and RepeatCount >0) then RepeatCount
else 0
end as 'SeverityCritical'
‘This classifies the servers into Development, DR or Production based on OU info and NetbiosName
,case when (lower(MTC.OrganizationalUnit) like '%dev%' or lower(MTC.NetbiosComputerName) like '%dev%') then 'Development'
when (lower(MTC.OrganizationalUnit) like '%dr%' or lower(MTC.NetbiosComputerName) like '%dr%') then 'DR'
else 'Production'
end as ServerRole

            ,day(ars.DWCreatedDateTime) triggerdate
            ,month(ars.DWCreatedDateTime) triggermonth
            ,year(ars.DWCreatedDateTime) triggeryear
            , MTC.ForestDnsName
            ,MTC.OrganizationalUnit
            ,MTC.NetbiosComputerName as 'Server'
            ,ME.FullName

from Alert.vAlertResolutionState ars
                  inner join alert.vAlertDetail adt on ars.alertguid = adt.alertguid
                  inner join Alert.vAlert alt on ars.alertguid = alt.alertguid
                  left join dbo.vManagedEntity ME on ME.ManagedEntityRowId = alt.ManagedEntityRowId
                  left join [OperationsManager].[dbo].[MT_Computer] MTC on lower(ME.path) like  '%' + lower(MTC.NetbiosComputerName)+ '%'
                  left join alertpriority Apy on Apy.alert = alt.Priority
                  left join alertseverity Asy on Asy.alert = alt.severity

where  month(ars.DWCreatedDateTime) in (@Month) and year(ars.DWCreatedDateTime) in (@YearDate) and ME.fullname NOT Like '%Jala%' and MTC.DNSName in (select TargetMonitoringObjectDisplayName as 'Group Members' from [OperationsManager].dbo.RelationshipGenericView where isDeleted=0 AND SourceMonitoringObjectDisplayName in (@Scomgrp))

)L1
Group by
L1.server
,L1.AlertName
,L1.priority
,L1.Severity
,L1.triggermonth
,L1.triggerdate
,L1.triggeryear
,L1.ForestDNSName
,L1.FullName

Saturday, February 11, 2012

Using Lync Client for OCS

While the new Lync Client brings a lot of new functions and a complete new look (nice one too J), it isn’t compatible with a OCS 2007 R2 environment. Another downside is that it can’t be installed together with Communicator 2007 on a single machine. This will benefit when a infrastructure is in the midst of migrating from OCS to Lync or when OCS users requires connectivity to both OCS 2007 R2 and Office365 Lync.
Out-of-the-box the client will give you an error message when you try to sign in into an OCS 2007 R2 pool, stating that the version is not correct. This tells me there IS some kind of communication, however, it’s being detected and blocked.
After some research from Google,  it has been found that there is a way to run the Lync 2010 client on a OCS 2007 R2 environment – simply by bypassing a version check. To bypass this check, you have to create a new registry entry:

Key: HKEY_CURRENT_USER\Software\Policies\Microsoft\Communicator
Name:  DisableServerCheck
Type: DWORD
Value: 1 (00000001)

When this entry has been created, the version check will be skipped, and the Lync Client WILL logon to the OCS 2007 R2 environment. Actually, most of the functions just work fine! IM, Presence, calling (MOC to MOC or MOC to Lync)  and video all as expected.
Of course there are some functions which don’t work correctly. One of these functions is the “Live Meeting” functionality; this is now built-in into the Lync Client, while in the previous version it was a separate client. Installing Lync will uninstall the LiveMeeting plug-ins in outlook as well, disabling you to schedule an old-fashion meeting. The other limitation that came with this workaround is that the address book cannot be synchronized which means that you will not be able to find anyone that was not added to your contacts previously in MOC. (To workaround this you could find the person in outlook and form there initiate a IM session, tedious but workable)

Friday, February 10, 2012

How to enable Cache mode on Outlook 2007 SP2 for shared mailbxoes

Since the introduction of Cached mode in Outlook, we've seen issues with users not understanding why additional mailbox access was so slow. Personal mailboxes were cached but unfortunately it was not possible to cache the additional mailboxes, resulting in a confusing experience for end-users.
There already was an Outlook 2007 post-SP1 update (KB 957909) which made caching of additional mailboxes possible, but since the introduction of Office 2007 SP2 it makes more sense to just upgrade Office 2007 to SP2.


To enable this feature, open up registry editor, navigate to to
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\Cached Mode
or
HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\12.0\Outlook\Cached Mode,

add a DWORD value named CacheOthersMail and assign it the value of "1".
Next, disable "header downloads":
In Outlook select File and then click Cached Exchange Mode. Clear the following options when enabled: Download Headers and then Full Items, Download Headers, On Slow Connections Download Only Header.


Thursday, February 9, 2012

Locking a Machine in a OCS Desktop Sharing/SCCM Remote Tools Session

With the many tools available now, there are many means for the support staff to access into a user's machine to render assistance. OCS desktop sharing as well as SCCM Tools is one of that is being used my my current organization.

These tools however come with a challenge. How will the support staff be able to maintain the security of the machine when the support case ends as they are not to logoff from the machine.

For this I have come up with a simple vbs that will enable the support staff to lock the screen remotely from their machine (Provided RPC connectivity is operational)

strcomputer = InputBox("Please enter computer name:", "Machine Name to Lock")

strCommand = "cmd.exe /k %windir%\System32\rundll32.exe user32.dll, LockWorkStation"

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objProcess = objWMIService.Get("Win32_Process")


errReturn = objProcess.Create(strCommand, null, null, intProcessID)

If errReturn = 0 Then
Wscript.Echo "**" & ucase(strcomputer) & " has been locked successfully**!"
End If

Just copy the code in grey as above and save it as a vbs file.

Alternatively if it is preferred to lock the machine locally, the below  can be run either at command prompt or run window

%windir%\System32\rundll32.exe user32.dll, LockWorkStation

Wednesday, February 8, 2012

OCS contact details not updated!

There will be instances when an OCS user in an enterprise have some details such as title changed in the active directory. The attributes have since been updated i the Exchange GAL. However, the changes are not reflected on the OCS user's properties.

By default, every night at 1:30AM the new address book is updated and at some random time within the first hour of logging in each day the local workstation downloads updates from the day before that are included in the compact delta file. In my opinion this next part is an overlook during the design, there are 2 AD attributes that are NOT included in the compact delta file, "office" and "title".Perhaps the Microsoft Developers did not think this would change often enough to warrant including it in the code, nor will it ever be.


The full and legacy delta files continue to include these attributes. The legacy and full delta files are only downloaded when a NEW galcontacts.db file is downloaded to the workstation. Another loophole in the programming is, even though the local galcontacts.db file displays the correct attributes, it will NOT reflect in MOC unless the user who's title, or whatever, changed has them as well.

Solution:

1) Logoff and close MOC client
2) In Windows 7, navigate to the path C:\Users\<username>\AppData\Local\Microsoft\Communicator\<user sip>
3) Delete the files GalContacts.db and GalCOntact.db.idx
4) Re-launch MOC client. Give a few moments for the files to be re-downloaded.

Maximum Token Size (Kerberos)



There may be instances where the user has been granted all the required access for them to perform an administrative task. An example is as of below, they are unable to perform a straight forward tasks of switching to another DC.. (Error is as per the screenshot below).

At the first look, it may look like a "disk space" issue as it mentions in the error that "Not enough storage". However, it may be not as it appears superficially.

In this case, the root cause is that token size which the user is having. By default 12000 is the token size and if the size of the Kerberos token exceeds this, the access rights assigned to this user will not be fully granted which will affect the level of access the user is supposed to have.


To verify the token size, Microsoft has provided a tool, Tokensz, for this to be done and it can be downloaded from the link below

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4a303fa5-cf20-43fb-9483-0f0b0dae265c&DisplayLang=en

The command to run the tool above with the sample output is as below

C:\TEMP\tokensz>tokensz.exe /compute_tokensize

Name: Kerberos Comment: Microsoft Kerberos V1.0
Current PackageInfo->MaxToken: 65535

Using user to user

QueryKeyInfo:
Signature algorithm = HMAC-SHA1-96
Encrypt algorithm = Kerberos AES256-CTS-HMAC-SHA1-96
KeySize = 256
Flags = 2083e
Signature Algorithm = 16
Encrypt Algorithm = 18
Start:10/30/2010 0:45:10
Expiry:10/30/2010 8:49:54
Current Time: 10/30/2010 0:45:10
MaxToken (complete context) 1640


Solution:


To overcome this, launch regedit on the machine affected and create a key "MaxTokenSize" in Dword format and enter the value "ffff" in Hex.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters]

"MaxTokenSize"=dword:0000ffff

Restart the machine once its completed.

Windows cannot log you on because your profile cannot be loaded

Log Name: Application
Source: Microsoft-Windows-User Profiles Service
Event ID: 1500
Level: Error
Description:
Windows cannot log you on because your profile cannot be loaded. Check that you are connected to the network, and that your network is functioning correctly.

Solution:

Note: This section, method, or task contains steps that tell you how to modify the registry. However, serious problems might occur if you modify the registry incorrectly. Therefore, make sure that you follow these steps carefully. For added protection, back up the registry before you modify it. Then, you can restore the registry if a problem occurs. For more information about how to back up and restore the registry

You only have to do these steps:
1- Logon with local admin profile. (or other account different that you want to use, but with admin privileges).

2- Back up all data in the current user's profile folder if the profile folder still exists, and then delete the profile folder. By default, the profile resides in the following location: %SystemDrive%\Users\UserName

3- Open regedit and go to HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList. Here you can see all SIDs of loaded profiles and probably you'll have some of them repeated but with .bak extensions.
4- So if you want to recover your profile, desktop icons, ect... you only have to delete the profile with no .bak extension and rename the other, deleting only the .bak extension of it:
Note SID is a placeholder for the security identifier (SID) of the user account that is experiencing the problem. The SID.bak subkey should contain a ProfileImagePath registry entry that points to the original profile folder of the user account that is experiencing the problem.

Ex: In Regedit (HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList) I have:

SID-1292428093-343818398-2115-158554 (1º Delete this Key)
SID-1292428093-343818398-2115-158554.bak (2º Rename This Key to SID-1292428093-343818398-2115-158554).

4- Restart your computer or Logoff and Logon with the profile that you want to restore and that's all, your profile will be restored Perfectly.

SCOM Service Level Objectives created not updated/available

There maybe instances where new Service Level Tracking objectives (SLO) are created in SCOM and these were not found in the Service Level Dashboard neither are the available on the service availability reports.


While troubleshooting, I have found this error on my SCOM RMS and I believe these are related.



Failed to store data in the Data Warehouse. Exception 'SqlException': Sql execution failed. Error 2627, Level 14, State 1, Procedure ManagementPackInstall, Line 2855, Message: Violation of UNIQUE KEY constraint 'UN_ManagementGroupManagementPackVersion_ManagementGroupRowIdManagementPackVersionRowId'. Cannot insert duplicate key in object 'dbo.ManagementGroupManagementPackVersion'. One or more workflows were affected by this. Workflow name: Microsoft.SystemCenter.DataWarehouse.Synchronization.Configuration Instance name: RMSServer Instance ID: {AF86A1AC-F1F5-9BF7-1E89-F60F73982EB6} Management group: GroupName

It turns out that MPS were queued awaiting synchronization which resulted in teh changes/additions made to the MPs not being updated. 


The SQL query below will enable you to find the MPs that are pending.

SELECT

ManagementPackId, MPFriendlyName,MPName, mp.MPVersionDependentId, MPLastModified, MPKeyToken, ContentReadable

FROM ManagementPack mp

WHERE MPVersionDependentId



NOT IN

(SELECT mpv.ManagementPackVersionDependentGuid

FROM OperationsMAnagerDW.dbo.ManagementPackVersion mpv

JOIN OperationsMAnagerDW.dbo.ManagementGroupManagementPackVersion mgmpv

ON (mpv.ManagementPackVersionRowId = mgmpv.ManagementPackVersionRowId)

WHERE (mgmpv.LatestVersionInd > 0))



AND NOT EXISTS

(SELECT * FROM ManagementPackReferences mpr

JOIN ManagementPack mpv

ON (mpr.ManagementPackIdSource = mpv.ManagementPackId)

WHERE (mpr.ManagementPackIdReffedBy = mp.ManagementPackId)

AND (mpv.MPVersionDependentId NOT IN

(SELECT mpv.ManagementPackVersionDependentGuid

FROM OperationsMAnagerDW.dbo.ManagementPackVersion mpv

JOIN OperationsMAnagerDW.dbo.ManagementGroupManagementPackVersion mgmpv

ON (mpv.ManagementPackVersionRowId = mgmpv.ManagementPackVersionRowId)

WHERE (mgmpv.LatestVersionInd > 0))))


Once the problematic MPs have been found , follow the procedures below to resolve the issue

We need to trigger sync manually. 
Follow the steps to starting at the top of the list, export the MP, and update the version attribute and reimport.

This will force that MP to resynchronize. Once all the MPs that are blocking synchronization have been updated, then all the other ones will update automatically

 Export MPs

For the unsealed MPs, please right click the MP in the SCOM console then export them as xml files.

For  sealed MPs, you can use following link and command to export as xml files http://blogs.technet.com/b/jonathanalmquist/archive/2009/03/30/export-a-management-pack.aspx

 Open the XML, Update the version attribute then save the files:

 For example:

<Identity>

<ID>Mpname<ID>

<Version>1.0.0.3</Version>

</Identity>



We increase the version to 1.0.0.4.



  1. Right click “management pack”, reimport the XML files.
  2. After reimporting all MPs in the query list, check whether we can get the service level object from report.



Note: Most of the MPs listing in the qurey result are customized MPs and will not have any impact.  

          For these Microsoft sealed MPs, the solution will impact following aspects:

          a. the sealed MP will be changed to unsealed b. it cannot auto update if new version of  this MPs are released. 


Hope this helps whoever i facing the same issue as I did.

Retrieving Active Directory Attribute Modification Information



Many a times, we may be required to verify the date /time that an attribute in a object example user account has changed and where is the Site that it was changed.

To do this, the following command can be used

repadmin /showobjmeta DCname "<DN of the user>" >c:\<username>.txt

The command will output the information into a text file with the user's name. A sample of the output is as below. With this you will be able to retrieve the change originated from which DC.

This is extremely good for enterprise with multiple DCs and when time comes for some CSI work to be done, you will know when and where to look.

Removing applications from machines without MSI packages

In SCCM, removing of any applications is using msiexec /x <msi package name>
However this command requires msi package to be available on the client itself. Of course you can say that its not not issue that the package is readily available. Well, think again. Consider this, example Skype that was installed 2 years back on a machine perhaps version 2.0. The current version of Skype is version 4.2 and you are unable to locate the msi package for version 2.0 anyway on the internet and you have 200 clients to uninstall. What can you do.
To overcome this, I have created a vbs to perform the same actions as if you are removing the application fromt the add remove program from the control panel.
How this works, there is actually an uninstall string that is kept in the registry for this purpose. If we can retrieve this value, we can perform the same.
The key location for various products unsintallation is at
Software\Microsoft\Windows\CurrentVersion\Uninstall\<Product_GUID>
Take note that the product GUID  is unique to each msi package.
The below is the vbs that i have created to remove skype
const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")

strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Uninstall\" & Subkey
strValueName = "DisplayName"
oReg.GetStringValue _
   HKEY_LOCAL_MACHINE,strKeyPath,strValueName,StringValue

if instr(lcase(stringvalue),"skype") > 0 then

strValueName = "uninstallstring"
oReg.GetStringValue _
   HKEY_LOCAL_MACHINE,strKeyPath,strValueName,StringValue
wscript.echo stringvalue
wshshell.run stringvalue & " /quiet /norestart"
end if
Next

Error re-running SCCM Advertisement

In SCCM for advertisement when you assign the particular advertisement to be mandatory, the advertisement will only run once and if you attempt to rerun the same advertisement on the same machine you will get the error as shown in the screenshot below.

To overcome this issue, do the following
 
  1. launch regedit.exe on the machine facing the issue
  2. Navigate to the following key
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Mobile Client\Software Distribution\Execution History\System]
  3. You will find various keys with the package name that has been previously executed on the machine (example HUB000016 etc)
  4. Determine the package name that you are attempting to re-run and delete the key.
    Example if you are attempting to re-run HUB000016 then you should delete the key Hub000016
Once the above is done, you may re-run the advertisement and to expedite the process you may like to refresh the machine policy on the target machine.

How to resolve black screen on Servers


We have had some Windows 2003 systems logon screens turn black no more gray background or the username and password fields turn from white to black so you can't see what your typing (this effects RDP and the console). They all still work if you can find them. As with the screenshot below you can see the problem is a nuisance.

The following maybe encountered in RDP, console or even DRAC access




The Fix:

Note: Always make a backup of your system before changing the registry

On a working windows 2003 system

1) open regedit
2) connect to remote registry
3 navigate to HKEY_USERS\.DEFAULT\Control Panel\Colors (on the effected system)
4) create a export of the current key
5) go to the working system, create a export of HKEY_USERS\.DEFAULT\Control Panel\Colors
6) import the working registry settings to the remote registry system that is effected by the black screen
7) Reboot the effected system the color should be restored now.


What the registry settings should be by default:

Windows Registry Editor Version 5.00
[HKEY_USERS\.DEFAULT\Control Panel\Colors]
"ActiveBorder"="212 208 200″
"ActiveTitle"="10 36 106″
"AppWorkSpace"="128 128 128″
"Background"="102 111 116″
"ButtonAlternateFace"="181 181 181″
"ButtonDkShadow"="64 64 64″
"ButtonFace"="212 208 200″
"ButtonHilight"="255 255 255″
"ButtonLight"="212 208 200″
"ButtonShadow"="128 128 128″
"ButtonText"="0 0 0″
"GradientActiveTitle"="166 202 240″
"GradientInactiveTitle"="192 192 192″
"GrayText"="128 128 128″
"Hilight"="10 36 106″
"HilightText"="255 255 255″
"HotTrackingColor"="0 0 128″
"InactiveBorder"="212 208 200″
"InactiveTitle"="128 128 128″
"InactiveTitleText"="212 208 200″
"InfoText"="0 0 0″
"InfoWindow"="255 255 225″
"Menu"="212 208 200″
"MenuText"="0 0 0″
"Scrollbar"="212 208 200″
"TitleText"="255 255 255″
"Window"="255 255 255″
"WindowFrame"="0 0 0″
"WindowText"="0 0 0″