August 12th, 2009 by Michael
As a follow up to my earlier post about the Remote server Administration Tools for the Windows 7 Release Candidate (RC), I thought I would post a link to the RTM version. It took a bit to find it. A search on Microsoft’s site wasn’t helpful to me. I finally found a reference on Ben’s Blog here: http://blogs.msdn.com/virtual_pc_guy/archive/2009/08/12/rsat-for-windows-7-rtm-now-available.aspx
Which sent me here:
Remote Server Administration Tools for Windows 7
Brief Description
Remote Server Administration Tools for Windows® 7 enables IT administrators to manage roles and features that are installed on computers that are running Windows Server® 2008 R2, Windows Server® 2008, or Windows Server® 2003, from a remote computer that is running Windows 7.
Download details: Remote Server Administration Tools for Windows 7
August 11th, 2009 by Michael
We have been having issues at work for a while where a user gets “cannot load the locally stored profile” and a temporary profile is created. It gets to be quite frustrating for the users because each time they log in they lose any settings that they have made. Apparently, we arent’ the only company that has been having this issue. The complete article has a very interesting discussion on the Windows Logical Prefetcher and what the cause of the problem was, but the gist of what you need to fix the problem is update your Citrix client or use the work arounds mentioned below:
Now that the problem was understood, Microsoft and Citrix brainstormed on workarounds customers could apply while Citrix worked on an update to the ICA Client that would prevent the sharing violation. One workaround was to disable application prefetching and another was to write a logoff script that deletes the Ssonsvr.exe prefetch files. Citrix published the workarounds in this Citrix Knowledge Base article and Microsoft in this Microsoft Knowledge Base article. The update to the ICA Client, which was made available a few days later, changed the network provider DLL to 10 seconds after Ssonsvr.exe launches before returning control to Mpnotify.exe. Because Winlogon waits for Mpnotify to exit before logging on a user, the Logical Prefetcher won’t associate Winlogon’s accesses of the user’s hive with Ssonsvr.exe’s startup.
Mark’s Blog : The Case of the Temporary Registry Profiles
August 7th, 2009 by Michael
Previously, I blogged about issues I was having where old recovery points were not being expired/removed from my DPM servers. I had to open a ticket with Microsoft, and worked with them to determine the cause, and since then, they have released a fix.
The fix that Microsoft developed is here: http://www.microsoft.com/downloads/details.aspx?FamilyID=aee949aa-d3e7-4b0f-b718-00b7c20f1257&displayLang=en
A few people have asked for the PowerShell script “show-pruneshadowcopies.ps1” that Microsoft provided and I mentioned in my previous post (here). The script looks like this:
#displays all RP for data sources and shows which RP’s would be deleted by the regular pruneshadowcopies.ps1
# Outputs to a logfile: C:\Program Files\Microsoft DPM\DPM\bin\SHOW-PRUNESHADOWCOPIES.LOG
#Author : Mike J
#Date : 02/24/2009
$version="V1.0"
$date=get-date
$logfile="SHOW-PRUNESHADOWCOPIES.LOG.txt"
function GetDistinctDays([Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.ProtectionGroup] $group,
[Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.Datasource] $ds)
{
if($group.ProtectionType -eq [Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.ProtectionType]::DiskToTape)
{
return 0
}
$scheduleList = get-policyschedule -ProtectionGroup $group -ShortTerm
if($ds -is [Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.FileSystem.FsDataSource])
{
$jobType = [Microsoft.Internal.EnterpriseStorage.Dls.Intent.JobTypeType]::ShadowCopy
}
else
{
$jobType = [Microsoft.Internal.EnterpriseStorage.Dls.Intent.JobTypeType]::FullReplicationForApplication
if($ds.ProtectionType -eq [Microsoft.Internal.EnterpriseStorage.Dls.Intent.ReplicaProtectionType]::ProtectFromDPM)
{
return 2
}
}
write-host "Look for jobType $jobType"
foreach($schedule in $scheduleList)
{
write-host("schedule jobType {0}" -f $schedule.JobType)
if($schedule.JobType -eq $jobType)
{
return [Math]::Ceiling(($schedule.WeekDays.Length * $ds.RecoveryRangeinDays) / 7)
}
}
return 0
}
function IsShadowCopyExternal($id)
{
$result = $false;
$ctx = New-Object -Typename Microsoft.Internal.EnterpriseStorage.Dls.DB.SqlContext
$ctx.Open()
$cmd = $ctx.CreateCommand()
$cmd.CommandText = "select COUNT(*) from tbl_RM_ShadowCopy where shadowcopyid = ‘$id’"
write-host $cmd.CommandText
$countObj = $cmd.ExecuteScalar()
write-host $countObj
if ($countObj -eq 0)
{
$result = $true
}
$cmd.Dispose()
$ctx.Close()
return $result
}
function IsShadowCopyInUse($id)
{
$result = $true;
$ctx = New-Object -Typename Microsoft.Internal.EnterpriseStorage.Dls.DB.SqlContext
$ctx.Open()
$cmd = $ctx.CreateCommand()
$cmd.CommandText = "select ArchiveTaskId, RecoveryJobId from tbl_RM_ShadowCopy where ShadowCopyId = ‘$id’"
write-host $cmd.CommandText
$reader = $cmd.ExecuteReader()
while($reader.Read())
{
if ($reader.IsDBNull(0) -and $reader.IsDBNull(1))
{
$result = $false
}
}
$cmd.Dispose()
$ctx.Close()
return $result
}
"**********************************" > $logfile
"Version $version" >> $logfile
get-date >> $logfile
$dpmservername = &"hostname"
$dpmsrv = connect-dpmserver $dpmservername
if (!$dpmsrv)
{
write-host "Unable to connect to $dpmservername"
exit 1
}
write-host $dpmservername
"Selected DPM server = $DPMservername" >> $logfile
$pgList = get-protectiongroup $dpmservername
if (!$pgList)
{
write-host "No PGs found"
disconnect-dpmserver $dpmservername
exit 2
}
write-host("Number of ProtectionGroups = {0}" -f $pgList.Length)
$replicaList = @{}
$latestScDateList = @{}
foreach($pg in $pgList)
{
$dslist = get-datasource $pg
if ($dslist.length -gt 0)
{
write-host("Number of datasources in this PG = {0}" -f $dslist.length)
("Number of datasources in this PG = {0}" -f $dslist.length) >> $logfile
}
Foreach ($ds in $dslist)
{
write-host("DS NAME= $ds")
("DS NAME= $ds") >>$logfile
}
foreach ($ds in $dslist)
{
$rplist = get-recoverypoint $ds | where { $_.DataLocation -eq ‘Disk’ }
write-host("Number of recovery points for $ds {0}" -f $rplist.length)
("Number of recovery points for $ds {0}" -f $rplist.length) >>$logfile
$countDistinctDays = GetDistinctDays $pg $ds
write-host("Number of days with fulls = $countDistinctDays")
("Number of days with fulls = $countDistinctDays") >>$logfile
if($countDistinctDays -eq 0)
{
write-host "D2T PG. No recovery points to delete"
"D2T PG. No recovery points to delete" >>$logfile
continue;
}
$replicaList[$ds.ReplicaPath] = $ds.RecoveryRangeinDays
$latestScDateList[$ds.ReplicaPath] = new-object DateTime 0,0
$lastDayOfRetentionRange = ([DateTime]::UtcNow).AddDays($ds.RecoveryRangeinDays * -1);
write-host("Distinct days to count = {0}. LastDayOfRetentionRange = {1} " -f $countDistinctDays, $lastDayOfRetentionRange)
("Distinct days to count = {0}. LastDayOfRetentionRange = {1} " -f $countDistinctDays, $lastDayOfRetentionRange) >>$logfile
$distinctDays = 0;
$lastDistinctDay = (get-Date).Date
$numberOfRecoveryPointsDeleted = 0
if ($rplist)
{
foreach ($rp in ($rplist | sort-object -property UtcRepresentedPointInTime -descending))
{
if ($rp)
{
if ($rp.UtcRepresentedPointInTime.Date -lt $lastDistinctDay)
{
$distinctDays += 1
$lastDistinctDay = $rp.UtcRepresentedPointInTime.Date
}
write-host(" $ds")
(" $ds") >>$logfile
write-host(" Recovery Point #$distinctdays RPtime={0}" -f $rp.UtcRepresentedPointInTime)
(" Recovery Point #$distinctdays RPtime={0}" -f $rp.UtcRepresentedPointInTime) >>$logfile
if (($distinctDays -gt $countDistinctDays) -and ($rp.UtcRepresentedPointInTime -lt $lastDayOfRetentionRange))
{
write-host ("Recovery Point would be deleted ! – RPtime={0}" -f $rp.UtcRepresentedPointInTime) -foregroundcolor red
("Recovery Point would be deleted ! – RPtime={0} <<<<<<<" -f $rp.UtcRepresentedPointInTime) >>$logfile
#remove-recoverypoint $rp -ForceDeletion -confirm:$true | out-null
$numberOfRecoveryPointsDeleted += 1
}
else
{
write-host " Recovery point not expired yet"
" Recovery point not yet expired" >>$logfile
}
}
else
{
write-host "Got a NULL rp"
"Got a NULL rp" >>$logfile
}
}
write-host "Number of RPs that would be deleted = $numberOfRecoveryPointsDeleted"
"Number of RPs that would be deleted = $numberOfRecoveryPointsDeleted" >>$logfile
}
}
}
disconnect-dpmserver $dpmservername
write-host "Exiting from script"
exit
August 3rd, 2009 by Michael
We have several (15 or so) Hyper-V hosts running a number (126 or so) guests. We use DPM to backup our servers, but only a few of our VMs are backed up at the host level. Most are backed up as regular clients. I have been having trouble with a couple of the ones that we do backup at the host level and just got to looking for the answer to what is going on. Lucky for me I waited long enough for the Core Team to come up with some suggestions:
Ask the Core Team : DPM 2007 – Troubleshooting protection for Hyper-V
This post is about Windows Server 2008 with the Hyper-V role installed, that are being protected by System Center Data Protection Manager 2007. There may be one or many Virtual Machines on each Host/Parent Partition, and they may be running Windows 2003 and/or Windows 2008.
Ask the Core Team : DPM 2007 – Troubleshooting protection for Hyper-V