Tuesday, October 23, 2012


Two Thousand Five Hundred Sixty. Seems like such a random and unassuming number, however, I can say this was the most disturbing number on the spectrum of disturbing numbers over the past few weeks. The numbers 13 and 666 were child’s play compared to the stress that 2,560 created.

What was this number you say? It was the number of unread messages I had in my personal mailbox the day after I took the Microsoft MCM SQL 2008 Lab exam. Every morning, I would wake up and see a number greater than 2,560 and internally the anticipation would begin. Would any of these new and foreign messages be the one I had been waiting for? Would it begin with “Congratulations” or would it begin with “Unfortunately”. Would this message mark a successful milestone on the already extended five year plan or would this be another speed bump to be planned around and overcome?

On Friday, October 19, 2012 the waiting was over. 2,560 turned to 2,561 one more time. This time was different. Instead of being the latest Amazon Local, SQL Central Newsletter, RedWing special, or a random SPAM, it was a message from boB Taylor (@SQLboBT) letting me know that I had passed one of the most feared exams in the SQL Server community – on the first attempt. The sky parted, the angels sang, and I gave my wife a big hug (I might have cried a little) .

The MCM was the culmination of a 5 year plan that has taken 6 years complete. It was step 5 preceded by working from home (started full time July 2012 – Thanks PTI!), obtaining Bachelor’s degree (complete February, 2012), selling my house (complete September 2010), and becoming a leader in the local SQL Server user group (complete July 2009).

Those close know – smooth has not been the norm while working through this plan. In the last six years, those three kids turned into five. While we did sell our house – we did so in unexpected timing – leaving us to move four times in the last three years. Add on to that - I’m on my 3rd employer since starting this path – but at least these guys are awesome.

Even the process of taking the test was not without issue. The power went out while I was taking my Knowledge exam. I had to wait three hours for the power to come back on and was able to complete the exam without having to make a second trip to Chicago. Little did I know that the process of taking the Lab exam would be even more painful. I drove to Chicago the night before, I got to the testing center early – got into the room – and waited for the test to begin. About five minutes later – it timed out. After four hours, the friendly staff thought they were ready, but the system was not. After sitting another hour – the system timed out again and I left Chicago not having opportunity to take the test. Fortunately, the next time I drove up to Chicago (two weeks later), the test worked and I was able to successfully take the test.

Through all of this – I’ve kept a secret in my back pocket. The secret - my beautiful and magnificent wife – Stephanie – who has been a blessed encouragement, a stable partner, and a hard working mother beside me each step of the way. We’ve taken a lot of hits and she’s still standing right there next to me. Without her I would have melted into a pool of 1s and 0s many months ago. I am thankful to be granted her wisdom, patience, and magnificence on a daily basis.

Looking back at all of the challenges – both personal and professional – I think I’ve stumbled upon what it means to be a Master. Setting a goal, facing adversity with a smile and pushing through until the goal is complete – all with the help of wise mentors, friends, and family. Rinse and Repeat.

While I can now declare that I am a Microsoft Certified Master and value this achievement dearly, this is not the end of the journey. A friend once told me that having an exceptional family means that I have to have an exceptional career as well. My family may not be the fastest, smartest, or the most good looking – but we are exceptional in many ways. Here’s to the continuing journey of building an exceptional career as my exceptional family navigates through life.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server MCM,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Friday, September 21, 2012

Vacation and SQLSat149

When I was considering submitting some sessions to SQL Saturday 149 in Minnesota I thought I would have a difficult time selling it to my family. It’s been very busy around here and I didn’t know how another trip may have been received. Much to my surprise, when I mentioned to my beautiful wife she thought it was a great idea! In fact, we decided that if any of my sessions were chosen that it would be a whole family trip.

Once I found out that the organizing committee was giving me an opportunity to talk about Locks, Blocks, and Deadlocks, the planning began. We’re all heading to the twin cities next week for a welcome break from the ordinary. It’s been an intense couple of years and we are all looking forward to a fun trip.

If you’re in Minneapolis next weekend – stop by the University of Minnesota and hear some awesome presentations. Minneapolis – be prepared. Not only is the #SQLFamily coming to town – so is the entire Neier family. All I can say is Mt. Olympus, Mall of America, and Oracle – you have all been warned!

Look forward to seeing everyone there!

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Friday, August 24, 2012

T-SQL: Performance of SQL Agent Duration Calculations

In my article published yesterday on using Powershell for SQL Durations (Working with SQL Agent Durations), I proposed using a combination of math functions to extract the durations of SQL Agent jobs in a dependable and accurate manner. While the article sought to provide a better alternative for those using Powershell, the discussion of the article was primarily about T-SQL solutions. The question of both capability and performance were both discussed, so I decided to research the limitations and performance metrics of the various solutions posted.

A combination of string and math based solutions were posted as potential alternatives. A recent post highlighted the use of the msdb function agent_datetime. All of these math functions posted will provide an accurate second value from a SQL Agent duration without regard to sign (positive or negative) or size (greater than 6 digits).

All of the string methods mentioned, including the agent_datetime function, rely on three facts to be true.
1) All values in the table must either be zero or positive integers
2) No value greater than 235959 can exist in the table because of datetime conversion issues.
3) Positions 2-3 and Positions 4-5 must not be greater than 60 due to datetime conversion issues.
While I understand that the existence of any of these values is a sign of a larger issue – if the code generating the report fails, the report is incapable of telling me there is a problem. I generally run reports on new environments to understand what the current state is and what needs to be worked on. It is not uncommon to find jobs that have run more than a day in a new environment. While less common, I have also had to deal with negative duration values stored in the sysjobhistory. I agree – neither is ideal and neither should exist. However, it is much more common for me to be called to fix what is broken, not to watch an already stable and perfect environment.

Testing Performance

I have never actually tested the performance of using the math based solution vs. the string manipulation solutions. So, I devised a process to put all of these suggestions to a performance test. I first created a table with integers –1971000 through 1971000. I understand this is extreme, in both directions, but I had to use something large enough to get some idea of performance.

You can examine the T-SQL at the end of this post. At each test, the T-SQL represents a proposed solution on the forum thread. Each test converts each of the integer values in the table to a number of seconds based upon the HHMMSS rule of how these durations are stored in sysjobhistory. These are populated into a variable so that any transfer to the client or IO issues are eliminated in the performance test. The only thing being tested should be CPU and memory throughput. In order to adjust for the performance of any given environment, I establish a control. This control does no conversion on the integer value, simply selects each one into a variable. This should provide a good baseline for what the maximum performance could be.

Given that each of the string functions proposed fail unless provided very specific numeric values, I eliminated any negative values, any values > 235959, and any values where the HH and SS values were > 59 to avoid datetime conversion errors.

Below is the average of each of these methods (and a control) over 10 executions for both my laptop and an enterprise class server.

RunType Laptop Server
235959 Control 60 27
235959 Mod Math Implicit 87 38
235959 Mod Math 90 44
235959 Mod Math Intrope 123 44
235959 SQL-Tucker 163 79
235959 rmechaber 182 90
Full Control 983 406
235959 agent_datetime 1516 658
Full Mod Math 1755 790
Full Mod Math Implicit 1814 867
Full Mod Math Intrope 2377 1077

Admittedly, the difference in these test scenarios is negligible. However, in all cases, using the mod operator and the implicit truncation within SQL Server was the fastest conversion method. In addition to being the fastest – it’s the most compact visibly and works for just about any values – not just those less than a single day. I encourage you to run these tests in your environment and see which solution comes out on top.

As with anything in SQL Server, when asked which method is “better” I would have to say “It depends.” However, if you ask which appears to be fastest, which works for most conceivable situations, and which will I use? I’m going to stick with math – and leave the strings be.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

T-SQL Used to Test

USE tempdb
Adapted from 
-- Suppress data loading messages

-- Create Sample Data using a Table Varable
    Positive and Negative values
SELECT TOP 3942000 IDENTITY(INT,-1971000,1) AS N
INTO Numbers
FROM sys.all_objects a, sys.all_objects b, sys.all_objects c, sys.all_objects d

-- Create a Primary Key and Clustered Index to control data order

CREATE TABLE DurationMetrics(
@DurationSeconds int

DECLARE @Loops INT = 10,
@i INT

SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds = N
FROM Numbers

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT 'Control' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*Mod Math*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
FLOOR(N/10000) * 3600 +
FLOOR(N/100%100) * 60 +
FROM Numbers

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT 'Mod Math' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*Mod Math Implicit*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
N/10000 * 3600 +
N/100%100 * 60 +
FROM Numbers

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT 'Mod Math Implicit' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*Mod Math Intrope*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
((N - N % 10000) /10000) * 60 * 60 
+ ((N % 10000 - N % 100) /100) * 60
+ N % 100
FROM Numbers

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT 'Mod Math Intrope' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 Control*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds = N
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 Control' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 SQL-Tucker*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds = 
datediff(ss,0,cast(stuff(stuff(left('000000',6-len(N))+cast(N AS VARCHAR),5,0,':'),3,0,':') AS DATETIME))
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 SQL-Tucker' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 Mod Math*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
FLOOR(N/10000) * 3600 +
FLOOR(N/100%100) * 60 +
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 Mod Math' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 Mod Math Implicit*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
N/10000 * 3600 +
N/100%100 * 60 +
FROM Numbers  WHERE N BETWEEN 0 AND 235959
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 Mod Math Implicit' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 Mod Math Intrope*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
((N - N % 10000) /10000) * 60 * 60 
+ ((N % 10000 - N % 100) /100) * 60
+ N % 100
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 Mod Math Intrope' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 rmechaber*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
LEFT(RIGHT('000000' + CAST(N AS VARCHAR(6)), 6), 2) *3600 +
Substring(RIGHT('000000' + CAST(N AS VARCHAR(6)), 6), 3, 2) *60 +
RIGHT(RIGHT('000000' + CAST(N AS VARCHAR(6)), 6), 2)
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 rmechaber' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

/*235959 agent_datetime*/
SELECT @i = 0

WHILE @Loops > @i
SELECT @DurationSeconds =  
AND N%100 < 60 AND N/100%100 < 60

SELECT @i = @i + 1

INSERT INTO DurationMetrics (RunType, StartTime, EndTime)
SELECT '235959 agent_datetime' AS RunType, @StartTime AS StartTime, @EndTime AS Endtime

SELECT RunType, 
AVG(DATEDIFF(ms, StartTime, EndTime)) AS AvgDurationMS,
MIN(DATEDIFF(ms, StartTime, EndTime)) AS MaxDurationMS,
MAX(DATEDIFF(ms, StartTime, EndTime)) AS MaxDurationMS
FROM DurationMetrics
ORDER BY AvgDurationMS

/*Clean Up*/
DROP TABLE DurationMetrics

Wednesday, August 8, 2012

Nacho Mama’s Training Class

That is what I wanted to name the new training series that we developed at my employer, Perpetual Technologies (PTI.net). Unfortunately, I couldn’t convince anyone to change their name to Nacho Mama, but I digress…

On August 22 and August 23, PTI is offering a two day workshop on SQL Server Performance and Troubleshooting. You can read more about it here as well as download a flier to share with your co-workers and friends.

I will be delivering three of the modules – “SQL Server Performance Analysis”, “Indexing for Performance”, and “Locks, Blocks, and Deadlocks”. Hope Foley (blog | twitter) will be delivering three modules – “SQL Instance Configuration”, “Basics of Database Maintenance” and “System Performance Analysis”. Arie (AJ) Jones (blog | twitter) will be delivering two of the modules – “Index Overview” and “Query Execution Plans”.

We’ve written original content for these sessions – all of it based upon experience from the front lines as we work with SQL Server on a daily basis. These couple of days promise to be exciting and full of SQL Server goodness.

If you are interested, you can get registration info here.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Tuesday, July 24, 2012

SQL Saturday 122: T-SQL 2012 presentation

This last weekend, I had the pleasure of being invited down to Louisville, KY to speak at SQL Saturday #122. The volunteers there chose to have me speak on some of the new features of SQL Server 2012 T-SQL.

I barely fit everything in the session – finishing up just as time was over. I was unable to give the windowing functions the time they deserved as one of the coolest features of T-SQL 2012. However, most of the demos worked and it seemed that the audience understood what I was trying to communicate and participated quite well. I had a blast hanging out with Jack Corbett (@unclebiguns), Eddie Wuerch (@EddieW), Craig Purnell (@CraigPurnell) and several other SQL Server experts.

I’ve uploaded the script files to the SQL Saturday website if you want to go through any of the demos for yourself.

Please feel free to hit me up with questions both here and on Twitter.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Sunday, July 8, 2012

Speaking at SQL Saturday 122 - Louisville

It has been a great couple of months for both me and for Perpetual Technologies (my employer). PTI has been able to sponsor several SQL Saturday events and we have had several members of the Microsoft team speak at numerous events.

I've been granted the pleasure to speak at SQL Saturday 122 in Louisville - just a couple hours south of home. I'll be speaking on some of the new features in SQL Server 2012 that relate to T-SQL. I'll be touching on some of the new .NET functions that are now built in to the engine, new ways to do error control, and wrapping up with some of the awesome windows functions introduced in T-SQL 2012. You can read the abstract here.

Get signed up here and get the opportunity to share, network, and learn from some local and national experts on SQL Server topics. It's only a couple weeks away - do not pass go, do not collect $200. Sign up today!

Look forward to seeing you there!

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek, IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Thursday, July 5, 2012

Powershell Add-Member: IsLogBackupAllowed ?

In my previous post, I shared some of the issues I had when attempting to get Add-Member to work with the SMO Database object. In this post, I’ll share some of the fruits of that experience as I show how to quickly determine if a database can have its log backed up through Powershell and SMO.

That’s Easy – just check the recovery model.

I could just say – yup – blog post done. However, it’s not. Consider the following code:
$instancename = ".\SQL2008R2"
$dbname = "TestFullRecovery"

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=, 
    Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop

Add-Type -AssemblyName "Microsoft.SqlServer.SmoExtended, Version=, 
    Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server ("$InstanceName")
$Backup = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Backup

$db = $srv.Databases["$dbname"]

if($db.RecoveryModel -eq "Full")
    #Take log backup of database only if the database is in full recovery        
    $Backup.Database = $db.name
    $Backup.Action = "Log"
    $Backup.Devices.AddDevice("C:\BAK\TestFullRecovery_log.trn", "File")
        throw $_.Exception.GetBaseException()
If you run this on a database that is in Full recovery mode but has not had a full backup, the following error will be thrown:

BACKUP LOG cannot be performed because there is no current database backup. BACKUP LOG is terminating abnormally.

This is because the database is in what is known as “pseudo-SIMPLE” mode. Paul Randal describes this issue here as he offers a T-SQL function to determine whether or not a database is really in Full Recovery mode. This can happen if a new database is created and not backed up yet or if the database has recently been switched into Full recovery mode without a subsequent full backup. If you are running in an environment where the application generates new databases like mushrooms, this can become an important issue to resolve.

One option if you are using SMO and Powershell for backups is that you could just catch the error and ignore if the error message is identical to that described above. I do not generally like relying on this type of exception handling – why knowingly execute code that will fail. Let's look at a more proactive solution.

Adding the IsLogBackupAllowed Property

Using Add-Member, we can add a new boolean property to the database object. In this case - instead of adding it as a literal value with the NoteProperty MemberType, the ScriptProperty MemberType allows us to create a property that can be dynamic at run time. Using the special variable "$this" within the construction of the property allows the value to be determined based upon other properties that already exist on the object as well as executing methods of the object to which this new property belongs.

I decided to use the name of “IsLogBackupAllowed” for this new property. This name seemed to fit in well with the other boolean properties of the database object like IsDatabaseSnapshot or IsMirroringEnabled. Leveraging the –PassThru parameter of Add-Member, we can create a simple function that will bring the functionality that Paul Randal created in T-SQL into Powershell. When referencing this function - it will return back the object you put into it with the addition of the IsLogBackupAllowed property.
$instancename = ".\SQL2008R2"

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=, 
    Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server ("$InstanceName")

function Add-DBMembers 
    $db | Add-Member -Name IsLogBackupAllowed -MemberType ScriptProperty `
        -Value {      
      if($this.Parent.Version.Major -ge 9)
                  -contains $this.RecoveryModel)
                  [string]::Format("SELECT last_log_backup_lsn 
                          FROM sys.database_recovery_status
                        WHERE database_id = {0}", $this.ID)
                        ).Tables[0].Rows[0].last_log_backup_lsn.GetType() -ne `
    } -PassThru
$db = $srv.Databases['TestFullRecovery']

$db = Add-DBMembers -Database $db

The function adds a ScriptProperty of IsLogBackupAllowed to a database object that is provided as a parameter. To determine whether the transaction log backup is allowed, the script first determines if the RecoveryModel property of the database is either Full or BulkLogged. If the database is in Simple recovery mode, there is no chance of getting a log backup. Once it is determined that the database could potentially have a log backup taken, the ExecuteWithResults method is implemented to use the same select from Paul’s post to determine the ability of backing up the log. If anything other than “DBNull” is returned for the column status, a value of True is sent to the caller. If the instance is not SQL 2005 or higher, this property returns $null . SQL 2000 does not make this metadata readily available.

But wait – there’s more!

If you’re asking yourself, That’s fine and dandy, but all the work I’m doing in the Add-Member could be done inline when taking log backups.  What's with all the additional work of making it a property? I'll return your question with a question.

What if the Add-Member step was not necessary? What if you could just reference $db.IsLogBackupAllowed in your code? In the next post, I’ll be showing you how this can be accomplished using the Types.ps1xml files as well as showing how to extend various SMO objects with properties that I have found to be handy in routine maintenance tasks.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek, IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Thursday, June 28, 2012

Powershell, SMO, and Add-Member - Not Always BFF

Over the past few weeks, I’ve been working with SMO to implement some maintenance routines across my clients. Because of the nature of most of my clients, Powershell is almost always the answer. I have been trying to simplify the coding of some of these scripts by using Add-Member.
I had some issues with the added property being sporadically (at least I thought) available, so I set out to determine what was going on. Below is the tale of SMO and the Missing Property.

Why Add-Member

The most common use of Add-Member is to build a custom object.
$MyCustomObject = New-Object PSObject

$MyCustomObject | Add-Member -MemberType NoteProperty -Name NewProperty `
    -Value "NewValue"

This is neat; however, that is only the proverbial tip of the iceberg. One of the greatest things about Powershell is that everything, absolutely everything, is an object. Not only is everything an object, Add-Member seems to work on just about every object that is created. This provides an easy way to extend objects to fit the needs of any custom scripts.
$HomeFolder = Get-Item $Env:USERPROFILE

$HomeFolder | Add-Member -MemberType AliasProperty -Name FullPath `
    -Value FullName


SMO Database – it’s an object, Add-Member will work, Right?

Yup. Well, sometimes. When debugging my scripts, I had no issue. However, when I started to test my scripts in a -noprofile session without debugging, the property that I added was empty.

Here’s an example that adding the property does not work in a Powershell session
$instancename = ".\SQL2008R2"

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=, 
    Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server ("$InstanceName")

$db = $srv.Databases["master"]

$db | Add-Member -MemberType NoteProperty -Name TestNoteProperty `
    -Value "AmIHere?"

If you run this, you get nothing. However, if you use the -PassThru switch on Add-Member and pipe to a Select-Object, it does work, but only in the pipeline. Referencing the new property after the pipeline is done still presents no value.
$instancename = ".\SQL2008R2"

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=, 
    Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server ("$InstanceName")

$db = $srv.Databases["master"]

$db | Add-Member -MemberType NoteProperty -Name TestNoteProperty `
    -Value "AmIHere?" -PassThru | Select-Object TestNoteProperty

Isolating the Problem

When trying to figure this out, I sent the name of the database object to the output so that I could verify that the object was there before I added the custom property. To my surprise, when I did this, the custom property worked.
$instancename = ".\SQL2008R2"

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=, 
    Culture=neutral, PublicKeyToken=89845dcd8080cc91" -ErrorAction Stop

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server ("$InstanceName")

$db = $srv.Databases["master"]

#Output the Name to make certain the object is acutally there

$db | Add-Member -MemberType NoteProperty -Name TestNoteProperty `
    -Value "AmIHere?"

Wow – so I have to reference a property before I can add one to it? It took a few seconds before I remembered that SMO has “Optimized Performance” and waits to instantiate the object until you need a property. To quote msdn:

The SMO architecture is more efficient in terms of memory because objects are only partially instantiated at first, and minimal property information is requested from the server. Full instantiation of objects is delayed until the object is explicitly referenced. An object is fully instantiated when a property is requested that is not in the set of properties that are first retrieved, or when a method is called that requires such a property. The transition between partially instantiated and fully instantiated objects is transparent to the user.

It’s only a guess that this is the problem, but I have not experienced this problem on any other objects in Powershell. During troubleshooting, I discovered a couple of workarounds

One option that you have as a workaround is to use the New-Object cmdlet to build the object explicitly. This seems to workaround whatever issue there is with the database object.
$db = New-Object Microsoft.SqlServer.Management.Smo.Database ($srv, "master")
As mentioned previously, you can also call an inexpensive property of the database object – like Name. It seems that by doing this, it allows Add-Member to properly add the peroperty.

I debated whether or not to submit this to Connect, then debated where to put it – Powershell or SQL Server. Because this problem seems to go away depending on how I instantiate the object, I decided to submit it to Powershell. If this is important, feel free to up-vote the submission.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

Tuesday, June 19, 2012

Enumerating Index Fragmentation with Powershell and SMO

I wish I could say that this was a simple task, but as I dove into SMO and some of its limitations, I soon discovered this would more difficult than I had imagined. I’m happy to share some background and some of the trials I had to overcome so that you might avoid having to take the same path.

Several months ago, I had a client that wanted to receive an index fragmentation report that showed the fragmentation of all indexes across their enterprise in one place. They planned to use this to audit the effectiveness of the maintenance procedures.

Given the flexibility of Powershell for outputting the report, I started there using SMO. I soon realized that there were some instances that were taking a very long time to return results. Unfortunately, in some of these cases, even the less than evil IS lock was creating issues as exclusive table lock escalation was being attempted and denied.

I was very excited to find that the Index class has an EnumFragmentation method. So, I decided that instead of getting the fragmentation an instance at a time, I could get it an index at a time. I could then set an SMO timeout and prevent the locks and IO from taking over the system completely while larger tables were interrogated.

Armed with the new found method, I wrote my loop and eventually had


I ran this on a couple of test servers and was confused when I had entire databases that had no information. Even small indexes were not reporting. However, other databases on the same instance had no issue. Not only did other databases have no issue, if a database had any results, it got all of the results. It was all or nothing.

After debugging a little, I soon realized that the 120 second timeout I had put in place was being hit for every index – regardless of size – within a particular database. Those indexes that were providing information were not timing out.

While this seemed odd, my first attempt was to increase the timeout and try again – maybe they were having IO issues the first run. Unfortunately, the second run had the same results. Every index in entire databases was timing out.

I wasn’t experiencing this issue locally, so I ran the code with with a SQL Trace running. Here’s what is run for an individual index:

exec sp_executesql N'
declare @database_id int
select @database_id = db_id()

i.name AS [Index_Name],
CAST(i.index_id AS int) AS [Index_ID],
fi.index_depth AS [Depth],
fi.page_count AS [Pages],
fi.record_count AS [Rows],
fi.min_record_size_in_bytes AS [MinimumRecordSize],
fi.max_record_size_in_bytes AS [MaximumRecordSize],
fi.avg_record_size_in_bytes AS [AverageRecordSize],
fi.forwarded_record_count AS [ForwardedRecords],
fi.avg_page_space_used_in_percent AS [AveragePageDensity],
fi.index_type_desc AS [IndexType],
fi.partition_number AS [PartitionNumber],
fi.ghost_record_count AS [GhostRows],
fi.version_ghost_record_count AS [VersionGhostRows],
fi.avg_fragmentation_in_percent AS [AverageFragmentation]
sys.tables AS tbl
INNER JOIN sys.indexes AS i ON (i.index_id > @_msparam_0 and i.is_hypothetical = @_msparam_1) AND (i.object_id=tbl.object_id)
INNER JOIN sys.dm_db_index_physical_stats(@database_id, NULL, NULL, NULL, ''LIMITED'') AS fi ON fi.object_id=CAST(i.object_id AS int) AND fi.index_id=CAST(i.index_id AS int)
(i.name=@_msparam_2)and((tbl.name=@_msparam_3 and SCHEMA_NAME(tbl.schema_id)=@_msparam_4))
[Index_Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',@_msparam_0=N'0',@_msparam_1=N'0',@_msparam_2=N'IX_MyTestTable_1',@_msparam_3=N'MyTestTable',@_msparam_4=N'dbo'

I missed the problem at first, but eventually realized that this was pulling the index fragmentation for the entire database each time it was running! Here is the portion of the command extracted from the trace that is the crux of the issue:

sys.dm_db_index_physical_stats(@database_id, NULL, NULL, NULL, 'LIMITED')

The results coming back to the client were filtered as part of a query predicate, not being fed as inputs to the function. That explained why the entire database worth of indexes timed out – I was scanning the entire database every time I thought I was scanning an index!

That really bugged me. I thought I had come up with an elegant solution and the code behind the scenes made it impossible to use. One of the reasons I generally revert to SMO is that it generally works across different versions of SQL Server and is generally upgrade resistant. So, I tried my command against a SQL 2000 database. To my surprise, the same problem was not present. In the SQL 2000 branch of the code, they use DBCC SHOWCONTIG and limit it in the command – not in the query following.

Ah, but never fear – the flexibility of Powershell is about to shine through. While it is inconvenient, I decided to write my own T-SQL to gather the index fragmentation information. I can use the ExecuteWithResults method of the database object to get the same information I would receive from the EnumFragmentation method of the index without the full database scan penalty.

Below is a script that I use to gather index fragmentation metrics from an instance.

For SQL 2000 instances, it will use the standard EnumFragmentation method. However, for 2005 and above, it will use the SQL string that I initialize in the begin portion of the script.

Back in December, I filed a Connect to Microsoft – the only feedback received is that they are “investigating”. SMO and Powershell are great tools, but when something like this doesn’t work as well as it could, it should really be fixed. If you would like to see this fixed, give it some votes.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek,
IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

string]$ClientName = "AnAwesomeClient",
string]$ReportFileLocation = "$Env:UserProfile\IndexReport.csv",
string]$ConnectionString = ("Data Source=.\SQL2008R2;
Initial Catalog=master;Integrated Security=SSPI;
Application Name=PTI Index Fragmentation Report

$sqlConnection = New-Object -TypeName `
System.Data.SqlClient.SqlConnection ($connectionString)
$srvConnection= New-Object -TypeName `
Microsoft.SqlServer.Management.Common.ServerConnection ($sqlConnection)
$srv = New-Object -TypeName `
Microsoft.SqlServer.Management.SMO.Server (

#Timeout in Seconds
$srv.ConnectionContext.StatementTimeout = 120

$IndexInfos = @()

foreach($database in $srv.Databases)
if(("master", "model", "tempdb") -notcontains $database.Name)

foreach($table in $database.Tables)
foreach($index in $table.Indexes)

if($srv.Version.Major -eq 8)
$IndexFragInfo = ($index.EnumFragmentation()).Rows[0];
elseif($srv.Version.Major -ge 9)
$IndexFragInfo = ($database.ExecuteWithResults(
$IndexFragQuery -f $database.ID, $table.ID,


$IndexInfo = New-IndexInfo

$IndexInfo.Client = $ClientName
$IndexInfo.Instance = $srv.Name
$IndexInfo.DatabaseName = $database.Name
$IndexInfo.TableName = $table.Name
$IndexInfo.IndexName = $index.Name
$IndexInfo.IndexColumns = (
string]::join(",", ($index.IndexedColumns |
sort-object @{Expression={$_.ID}; Ascending=$false} |
$IndexInfo.IsClustered = $index.IsClustered
$IndexInfo.IsUnique = $index.IsUnique
$IndexInfo.SpaceUsed = $index.SpaceUsed
$IndexInfo.Pages = $IndexFragInfo.Pages
$IndexInfo.FillFactor = $index.FillFactor
$IndexInfo.AverageFragmentation = (

$IndexInfos += $IndexInfo

$IndexInfos | Export-Csv -NoTypeInformation -Path $ReportFileLocation


#Load SMO
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=,
Culture=neutral, PublicKeyToken=89845dcd8080cc91
" -ErrorAction Stop
Add-Type -AssemblyName "Microsoft.SqlServer.ConnectionInfo,
Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
" `
-ErrorAction Stop

Function New-IndexInfo
$IndexInfo = "" | SELECT Client, Instance, DatabaseName, TableName, `
IndexName, IndexColumns, IsClustered, IsUnique, SpaceUsed, Pages,
Rows, FillFactor,


$IndexFragQuery = "SELECT
index_depth AS [Depth],
page_count AS [Pages],
record_count AS [Rows],
min_record_size_in_bytes AS [MinimumRecordSize],
max_record_size_in_bytes AS [MaximumRecordSize],
avg_record_size_in_bytes AS [AverageRecordSize],
forwarded_record_count AS [ForwardedRecords],
avg_page_space_used_in_percent AS [AveragePageDensity],
index_type_desc AS [IndexType],
partition_number AS [PartitionNumber],
ghost_record_count AS [GhostRows],
version_ghost_record_count AS [VersionGhostRows],
avg_fragmentation_in_percent AS [AverageFragmentation]
sys.dm_db_index_physical_stats({0}, {1}, {2}, NULL, 'LIMITED')

Wednesday, June 6, 2012

Powershell Add-Type – Where’s That Assembly!

I’ve been working a lot lately with SMO and the differences between the various versions between SQL 2005, 2008, and 2012. Through this process, I’ve come to understand why “[Reflection.Assembly]::LoadWithPartialName” is not a good option in PowerShell. Not only is it obsolete, it doesn’t allow you to choose which version of the SMO library you want to load and always loads the most recent. So, if you have SQL 2005, 2008, and 2012, you’ll get the 2012 versions regardless.

I wanted more control, so started to switch from LoadWithPartialName to Add-Type. I used the following code on my workstation and attempted to load the SMO assembly and it worked just fine.
Add-Type -AssemblyName "Microsoft.SqlServer.SMO"

When I checked what version of the assembly that had loaded, I realized that it had chosen the 2005 version? I thought, great, this does the opposite of LoadWithPartialName and loads the oldest… So, I tried it on box that did not have the 2005 client installed. To my surprise, it failed with the following error:
Add-Type : Could not load file or assembly 'Microsoft.SqlServer.Smo, Version=, Culture=neutral, 
PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.

A quick Bing search found an interesting Connect posting that offered some explanation. To quote “Microsoft” in the comment “The list is hard coded so that anybody writing “Add-Type –Assembly Microsoft.SqlServer.Smo” gets the same version.” In a similar vein, the documentation for Add-Type states that if “you enter a simple or partial name, Add-Type resolves it to the full name, and then uses the full name to load the assembly”. While this makes some sense, neither of these statements is clear exactly from what list this pulls from.

I spent some time with ProcessMonitor trying to determine if it was getting it from the registry or possibly from a different DLL with no luck. After spending some intimate time Bingling, trying to hit up methods and properties of the AddTypeCommand class, and otherwise coming up empty handed, I decided to take an alternate approach.

All the assemblies that I currently care to load for my work will be stored in one of the six folders of the GAC (Global Assembly Cache) on my Windows 7 Workstation. I decided to take this known list of assemblies and toss it to Add-Type and see what fell out.

The script below will take all of the assembly names that it can find and throw them at the Add-Type cmdlet. If the cmdlet loads the assembly, the current assembly list is examined to determine the full name of the assembly that was loaded.

If the cmdlet fails, the type of failure is recorded. If the assembly could not be loaded because the short name references an assembly that just doesn’t exist. Technically, Add-Type has that assembly in its list, so we can take the information out of the exception and know what the full assembly name was and store that value.

There are several assemblies that Add-Type does not seem to have a reference for. These will throw a custom error of ASSEMBLY_NOT_FOUND which means that the lookup failed. These assemblies are not in the list.

The full code is below. I understand, this is a very resource intensive approach, but there is little other choice that I could find that would tell me what versions the cmdlet would be loading for any given assembly. On my machine, it attempted to load 1073 assemblies (took a while). Of those, I was able to determine that 308 of them are in the Add-Type list. I’ve also included my list below. I do not believe this list to be comprehensive, but I do think it is safe to say that anything on this list reflects the accurate full name that Add-Type will resolve to if you provide a partial name.

About Kyle Neier
Husband of a magnificent woman, father of 5, SQL Server geek, IndyPASS Vice President and Food Guy, DBA automation zealot, amateur Powershell evangelist. Follow Me on Twitter

#Best to Start this in a powershell.exe -noprofile session

$CSVLocation = "$Env:USERPROFILE\Add_Type_Lookup.csv"

#Initialize Array to hold assemblies to attempt to load
$AssemblyNames = @()
$AssemblyReferences = @()

#Get all assemblies currently in the _old_ GAC
Get-ChildItem "C:\Windows\assembly\GAC" | Select -Unique Name |
    ForEach-Object{$AssemblyNames += $_.Name}
#32/64 bit compatibles
Get-ChildItem "C:\Windows\assembly\GAC_MSIL" | Select -Unique Name |
        $AssemblyNames -notcontains $_.Name){$AssemblyNames += $_.Name}}

#Get any 32-bit specific assemblies not already loaded
Get-ChildItem "C:\Windows\assembly\GAC_32" | Select -Unique Name |
        $AssemblyNames -notcontains $_.Name){$AssemblyNames += $_.Name}}

#Get any 64-bit specific assemblies
Get-ChildItem "C:\Windows\assembly\GAC_64" | Select -Unique Name |
        $AssemblyNames -notcontains $_.Name){$AssemblyNames += $_.Name}}

#New GAC

#Combined 32/64
Get-ChildItem "C:\Windows\Microsoft.NET\assembly\GAC_MSIL" | 
    Select -Unique Name |
        $AssemblyNames -notcontains $_.Name){$AssemblyNames += $_.Name}}
#32 only
Get-ChildItem "C:\Windows\Microsoft.NET\assembly\GAC_32" | 
    Select -Unique Name |
        $AssemblyNames -notcontains $_.Name){$AssemblyNames += $_.Name}}
#64 only
Get-ChildItem "C:\Windows\Microsoft.NET\assembly\GAC_64" | 
    Select -Unique Name |
        $AssemblyNames -notcontains $_.Name){$AssemblyNames += $_.Name}}

#Now that I have all the assembly names in my GAC, loop over each of them
#and see how add-type reacts
foreach($AssemblyName in $AssemblyNames)
    #Create object to throw into array for further evaluation
    $AssemblyReference = "" | select Name, FullName
    #The name of the assembly is present, no need to gather that
    #from any of the code below
    $AssemblyReference.Name = $AssemblyName
        Add-Type -AssemblyName $AssemblyName -ErrorAction Stop
        #If there is no error, the assembly is in the hard-coded list within
        #Add-Type, so let's interrogate the current appdomain assembly list 
        #to determine the actual full name that was loaded
        $AssemblyReference.FullName = (
            [AppDomain]::CurrentDomain.GetAssemblies() |
                ?{$_.FullName -like "$AssemblyName,*"}).FullName
    catch [System.IO.FileNotFoundException]
        #If the name is in the Add-Type hard-coded list, it attempts to load it
        #If it can't be loaded, it throws a convenient FileNotFoundException
        #Fortunately, the "FileName" is the full name of the assembly
        #that was attempted to be loaded
        $AssemblyReference.FullName = $_.Exception.FileName

        if($_.FullyQualifiedErrorID -like "ASSEMBLY_NOT_FOUND*")
            #Add-Type throws an error of ASSEMBLY_NOT_FOUND if the short name
            #is not in the list - so regardless of how hard we wish, we can't
            #load this assembly unless we use the full name
            $AssemblyReference.FullName = "Not In List"
            #Some other error occured that is not expected
            #Log the fullname as unknown so that it can be evaluated later
            $AssemblyReference.FullName = "UNKNOWN"
    #Add the assembly object which has the short and full name to the array
    $AssemblyReferences += $AssemblyReference

#Send the array out to a CSV file and open it
$AssemblyReferences | ?{("Not In List") -notcontains $_.FullName} | 
    Sort-Object Name | 
    Export-Csv -NoTypeInformation -Path $CSVLocation

Invoke-Item $CSVLocation

Add-Type Assembly Reference List from my Windows 7 64-bit workstation:

AccessibilityAccessibility, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
ADODBADODB, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
AspNetMMCExtAspNetMMCExt, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
CppCodeProviderCppCodeProvider, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
cscompmgdcscompmgd, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
CustomMarshalersCustomMarshalers, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
EnvDTEEnvDTE, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
EnvDTE80EnvDTE80, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
EnvDTE90EnvDTE90, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
EventViewerEventViewer, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
EventViewer.ResourcesEventViewer.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
ExtensibilityExtensibility, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
IEExecRemoteIEExecRemote, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
IEHostIEHost, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
IIEHostIIEHost, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
ipdmctrlipdmctrl, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
ISymWrapperISymWrapper, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
MFCMIFC80MFCMIFC80, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.AnalysisServicesMicrosoft.AnalysisServices, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.AnalysisServices.AdomdClientMicrosoft.AnalysisServices.AdomdClient, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.AnalysisServices.DeploymentEngineMicrosoft.AnalysisServices.DeploymentEngine, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.Build.Conversion.v3.5Microsoft.Build.Conversion.v3.5, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.EngineMicrosoft.Build.Engine, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.FrameworkMicrosoft.Build.Framework, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.TasksMicrosoft.Build.Tasks, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.Tasks.v3.5Microsoft.Build.Tasks.v3.5, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.UtilitiesMicrosoft.Build.Utilities, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Build.Utilities.v3.5Microsoft.Build.Utilities.v3.5, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.DataWarehouse.InterfacesMicrosoft.DataWarehouse.Interfaces, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.ExceptionMessageBoxMicrosoft.ExceptionMessageBox, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.GroupPolicy.InteropMicrosoft.GroupPolicy.Interop, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.GroupPolicy.ReportingMicrosoft.GroupPolicy.Reporting, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.GroupPolicy.Reporting.ResourcesMicrosoft.GroupPolicy.Reporting.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.InkMicrosoft.Ink, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Ink.ResourcesMicrosoft.Ink.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.Internal.VisualStudio.Shell.Interop.9.0Microsoft.Internal.VisualStudio.Shell.Interop.9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Interop.Security.AzRolesMicrosoft.Interop.Security.AzRoles, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.JScriptMicrosoft.JScript, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.ManagementConsoleMicrosoft.ManagementConsole, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.ManagementConsole.ResourcesMicrosoft.ManagementConsole.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.mshtmlMicrosoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.MSXMLMicrosoft.MSXML, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.NetEnterpriseServers.ExceptionMessageBoxMicrosoft.NetEnterpriseServers.ExceptionMessageBox, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.Office.InfoPathMicrosoft.Office.InfoPath, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.InfoPath.Client.Internal.HostMicrosoft.Office.InfoPath.Client.Internal.Host, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.InfoPath.Client.Internal.Host.InteropMicrosoft.Office.InfoPath.Client.Internal.Host.Interop, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.InfoPath.FormControlMicrosoft.Office.InfoPath.FormControl, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.InfoPath.PermissionMicrosoft.Office.InfoPath.Permission, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.InfoPath.VstaMicrosoft.Office.InfoPath.Vsta, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.AccessMicrosoft.Office.Interop.Access, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.Access.DaoMicrosoft.Office.Interop.Access.Dao, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.ExcelMicrosoft.Office.Interop.Excel, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.GraphMicrosoft.Office.Interop.Graph, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.InfoPathMicrosoft.Office.Interop.InfoPath, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.InfoPath.SemiTrustMicrosoft.Office.Interop.InfoPath.SemiTrust, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.InfoPath.XmlMicrosoft.Office.Interop.InfoPath.Xml, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.OneNoteMicrosoft.Office.Interop.OneNote, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.OutlookMicrosoft.Office.Interop.Outlook, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.OutlookViewCtlMicrosoft.Office.Interop.OutlookViewCtl, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.PowerPointMicrosoft.Office.Interop.PowerPoint, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.PublisherMicrosoft.Office.Interop.Publisher, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.SmartTagMicrosoft.Office.Interop.SmartTag, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Interop.WordMicrosoft.Office.Interop.Word, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Office.Tools.CommonMicrosoft.Office.Tools.Common, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Office.Tools.ExcelMicrosoft.Office.Tools.Excel, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Office.Tools.OutlookMicrosoft.Office.Tools.Outlook, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Office.Tools.WordMicrosoft.Office.Tools.Word, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.PowerShell.Commands.DiagnosticsMicrosoft.PowerShell.Commands.Diagnostics, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Commands.ManagementMicrosoft.PowerShell.Commands.Management, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Commands.Management.ResourcesMicrosoft.PowerShell.Commands.Management.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Commands.UtilityMicrosoft.PowerShell.Commands.Utility, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Commands.Utility.ResourcesMicrosoft.PowerShell.Commands.Utility.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.ConsoleHostMicrosoft.PowerShell.ConsoleHost, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.ConsoleHost.ResourcesMicrosoft.PowerShell.ConsoleHost.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.EditorMicrosoft.PowerShell.Editor, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Editor.ResourcesMicrosoft.PowerShell.Editor.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.GPowerShellMicrosoft.PowerShell.GPowerShell, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.GPowerShell.ResourcesMicrosoft.PowerShell.GPowerShell.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.GraphicalHostMicrosoft.PowerShell.GraphicalHost, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.GraphicalHost.ResourcesMicrosoft.PowerShell.GraphicalHost.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.SecurityMicrosoft.PowerShell.Security, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.PowerShell.Security.ResourcesMicrosoft.PowerShell.Security.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.ReportViewer.CommonMicrosoft.ReportViewer.Common, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.ReportViewer.DesignMicrosoft.ReportViewer.Design, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.ReportViewer.ProcessingObjectModelMicrosoft.ReportViewer.ProcessingObjectModel, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.ReportViewer.WebDesignMicrosoft.ReportViewer.WebDesign, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.ReportViewer.WebFormsMicrosoft.ReportViewer.WebForms, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.ReportViewer.WinFormsMicrosoft.ReportViewer.WinForms, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.SqlServer.BatchParserMicrosoft.SqlServer.BatchParser, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.ConnectionInfoMicrosoft.SqlServer.ConnectionInfo, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.CustomControlsMicrosoft.SqlServer.CustomControls, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.GridControlMicrosoft.SqlServer.GridControl, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.InstapiMicrosoft.SqlServer.Instapi, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.MgdSqlDumperMicrosoft.SqlServer.MgdSqlDumper, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.RegSvrEnumMicrosoft.SqlServer.RegSvrEnum, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.ReplicationMicrosoft.SqlServer.Replication, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.Replication.BusinessLogicSupportMicrosoft.SqlServer.Replication.BusinessLogicSupport, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.RmoMicrosoft.SqlServer.Rmo, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.ServiceBrokerEnumMicrosoft.SqlServer.ServiceBrokerEnum, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.SmoMicrosoft.SqlServer.Smo, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.SmoEnumMicrosoft.SqlServer.SmoEnum, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.SqlEnumMicrosoft.SqlServer.SqlEnum, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.SqlTDiagMMicrosoft.SqlServer.SqlTDiagM, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.SStringMicrosoft.SqlServer.SString, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.WizardFrameworkLiteMicrosoft.SqlServer.WizardFrameworkLite, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.SqlServer.WmiEnumMicrosoft.SqlServer.WmiEnum, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Microsoft.StdFormatMicrosoft.StdFormat, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.TpmMicrosoft.Tpm, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft.Tpm.ResourcesMicrosoft.Tpm.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
Microsoft.Transactions.BridgeMicrosoft.Transactions.Bridge, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Transactions.Bridge.DtcMicrosoft.Transactions.Bridge.Dtc, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Vbe.InteropMicrosoft.Vbe.Interop, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.Vbe.Interop.FormsMicrosoft.Vbe.Interop.Forms, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Microsoft.VisualBasicMicrosoft.VisualBasic, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualBasic.CompatibilityMicrosoft.VisualBasic.Compatibility, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualBasic.Compatibility.DataMicrosoft.VisualBasic.Compatibility.Data, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualBasic.VsaMicrosoft.VisualBasic.Vsa, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualCMicrosoft.VisualC, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualC.STLCLRMicrosoft.VisualC.STLCLR, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualC.VSCodeParserMicrosoft.VisualC.VSCodeParser, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualC.VSCodeProviderMicrosoft.VisualC.VSCodeProvider, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudioMicrosoft.VisualStudio, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.CommandBarsMicrosoft.VisualStudio.CommandBars, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.CommonIDEMicrosoft.VisualStudio.CommonIDE, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.ConfigurationMicrosoft.VisualStudio.Configuration, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Debugger.InteropMicrosoft.VisualStudio.Debugger.Interop, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Debugger.InteropAMicrosoft.VisualStudio.Debugger.InteropA, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.DebuggerVisualizersMicrosoft.VisualStudio.DebuggerVisualizers, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.DesignMicrosoft.VisualStudio.Design, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Designer.InterfacesMicrosoft.VisualStudio.Designer.Interfaces, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Diagnostics.ServiceModelSinkMicrosoft.VisualStudio.Diagnostics.ServiceModelSink, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.EditorsMicrosoft.VisualStudio.Editors, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.EnterpriseToolsMicrosoft.VisualStudio.EnterpriseTools, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.EnterpriseTools.ClassDesignerMicrosoft.VisualStudio.EnterpriseTools.ClassDesigner, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.EnterpriseTools.ShellMicrosoft.VisualStudio.EnterpriseTools.Shell, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.EnterpriseTools.TypeSystemMicrosoft.VisualStudio.EnterpriseTools.TypeSystem, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.HostingProcess.UtilitiesMicrosoft.VisualStudio.HostingProcess.Utilities, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.HostingProcess.Utilities.SyncMicrosoft.VisualStudio.HostingProcess.Utilities.Sync, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.ManagedInterfacesMicrosoft.VisualStudio.ManagedInterfaces, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.ModelingMicrosoft.VisualStudio.Modeling, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Modeling.ArtifactMapperMicrosoft.VisualStudio.Modeling.ArtifactMapper, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Modeling.ArtifactMapper.VSHostMicrosoft.VisualStudio.Modeling.ArtifactMapper.VSHost, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Modeling.DiagramsMicrosoft.VisualStudio.Modeling.Diagrams, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Modeling.Diagrams.GraphObjectMicrosoft.VisualStudio.Modeling.Diagrams.GraphObject, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.OLE.InteropMicrosoft.VisualStudio.OLE.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Package.LanguageServiceMicrosoft.VisualStudio.Package.LanguageService, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.ProjectAggregatorMicrosoft.VisualStudio.ProjectAggregator, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.PublishMicrosoft.VisualStudio.Publish, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.QualityTools.ResourceMicrosoft.VisualStudio.QualityTools.Resource, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.QualityTools.UnitTestFrameworkMicrosoft.VisualStudio.QualityTools.UnitTestFramework, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.ShellMicrosoft.VisualStudio.Shell, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Shell.9.0Microsoft.VisualStudio.Shell.9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Shell.DesignMicrosoft.VisualStudio.Shell.Design, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Shell.InteropMicrosoft.VisualStudio.Shell.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Shell.Interop.8.0Microsoft.VisualStudio.Shell.Interop.8.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Shell.Interop.9.0Microsoft.VisualStudio.Shell.Interop.9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.TeamSystem.PerformanceWizardMicrosoft.VisualStudio.TeamSystem.PerformanceWizard, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.TemplateWizardInterfaceMicrosoft.VisualStudio.TemplateWizardInterface, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.TextManager.InteropMicrosoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.TextManager.Interop.8.0Microsoft.VisualStudio.TextManager.Interop.8.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.TextManager.Interop.9.0Microsoft.VisualStudio.TextManager.Interop.9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.AdapterMicrosoft.VisualStudio.Tools.Applications.Adapter, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.Adapter.v9.0Microsoft.VisualStudio.Tools.Applications.Adapter.v9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.AddInManagerMicrosoft.VisualStudio.Tools.Applications.AddInManager, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.BlueprintsMicrosoft.VisualStudio.Tools.Applications.Blueprints, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.ComRPCChannelMicrosoft.VisualStudio.Tools.Applications.ComRPCChannel, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.ContractMicrosoft.VisualStudio.Tools.Applications.Contract, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.Contract.v9.0Microsoft.VisualStudio.Tools.Applications.Contract.v9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.DesignTimeMicrosoft.VisualStudio.Tools.Applications.DesignTime, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.HostingMicrosoft.VisualStudio.Tools.Applications.Hosting, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.Hosting.v9.0Microsoft.VisualStudio.Tools.Applications.Hosting.v9.0, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.InteropAdapterMicrosoft.VisualStudio.Tools.Applications.InteropAdapter, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.RuntimeMicrosoft.VisualStudio.Tools.Applications.Runtime, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Applications.ServerDocumentMicrosoft.VisualStudio.Tools.Applications.ServerDocument, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Tools.Office.RuntimeMicrosoft.VisualStudio.Tools.Office.Runtime, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VCCodeModelMicrosoft.VisualStudio.VCCodeModel, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VCProjectMicrosoft.VisualStudio.VCProject, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VCProjectEngineMicrosoft.VisualStudio.VCProjectEngine, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VirtualTreeGridMicrosoft.VisualStudio.VirtualTreeGrid, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VSContentInstallerMicrosoft.VisualStudio.VSContentInstaller, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VSHelpMicrosoft.VisualStudio.VSHelp, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.VSHelp80Microsoft.VisualStudio.VSHelp80, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Windows.FormsMicrosoft.VisualStudio.Windows.Forms, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.WizardFrameworkMicrosoft.VisualStudio.WizardFramework, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.ZipMicrosoft.VisualStudio.Zip, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VsaMicrosoft.Vsa, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.Vsa.Vb.CodeDOMProcessorMicrosoft.Vsa.Vb.CodeDOMProcessor, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VSDesignerMicrosoft.VSDesigner, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.WSMan.ManagementMicrosoft.WSMan.Management, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Microsoft_VsaVbMicrosoft_VsaVb, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
MiguiControlsMIGUIControls, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
MiguiControls.ResourcesMIGUIControls.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
MMCExMMCEx, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
MMCEx.ResourcesMMCEx.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
MMCFxCommonMMCFxCommon, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
MMCFxCommon.ResourcesMMCFxCommon.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
MSClusterLibMSClusterLib, Version=, Culture=neutral, PublicKeyToken=89845dcd8080cc91
mscomctlmscomctl, Version=10.0.4504.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
mscorcfgmscorcfg, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlibmscorlib, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
MSDATASRCMSDATASRC, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
msddslmpmsddslmp, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
msddspmsddsp, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
napcryptnapcrypt, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
naphlprnaphlpr, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
napinitnapinit, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
napinit.resourcesnapinit.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
napsnapnapsnap, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
napsnap.resourcesnapsnap.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
officeoffice, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.1.0.Microsoft.InkPolicy.1.0.Microsoft.Ink, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Policy.1.0.Microsoft.Interop.Security.AzRolesPolicy.1.0.Microsoft.Interop.Security.AzRoles, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Policy.1.2.Microsoft.Interop.Security.AzRolesPolicy.1.2.Microsoft.Interop.Security.AzRoles, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Policy.1.7.Microsoft.InkPolicy.1.7.Microsoft.Ink, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Policy.11.0.Microsoft.Office.Interop.AccessPolicy.11.0.Microsoft.Office.Interop.Access, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.ExcelPolicy.11.0.Microsoft.Office.Interop.Excel, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.GraphPolicy.11.0.Microsoft.Office.Interop.Graph, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.InfoPathPolicy.11.0.Microsoft.Office.Interop.InfoPath, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.InfoPath.XmlPolicy.11.0.Microsoft.Office.Interop.InfoPath.Xml, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.OutlookPolicy.11.0.Microsoft.Office.Interop.Outlook, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.OutlookViewCtlPolicy.11.0.Microsoft.Office.Interop.OutlookViewCtl, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.PowerPointPolicy.11.0.Microsoft.Office.Interop.PowerPoint, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.PublisherPolicy.11.0.Microsoft.Office.Interop.Publisher, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.SmartTagPolicy.11.0.Microsoft.Office.Interop.SmartTag, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Office.Interop.WordPolicy.11.0.Microsoft.Office.Interop.Word, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.Microsoft.Vbe.InteropPolicy.11.0.Microsoft.Vbe.Interop, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
Policy.11.0.officePolicy.11.0.office, Version=, Culture=neutral, PublicKeyToken=71e9bce111e9429c
PresentationBuildTasksPresentationBuildTasks, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationCFFRasterizerPresentationCFFRasterizer, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationCorePresentationCore, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationFrameworkPresentationFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationFramework.AeroPresentationFramework.Aero, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationFramework.ClassicPresentationFramework.Classic, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationFramework.LunaPresentationFramework.Luna, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationFramework.RoyalePresentationFramework.Royale, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
PresentationUIPresentationUI, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
ReachFrameworkReachFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
SMDiagnosticsSMDiagnostics, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
soapsudscodesoapsudscode, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
stdolestdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
sysgloblsysglobl, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
SystemSystem, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.AddInSystem.AddIn, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.AddIn.ContractSystem.AddIn.Contract, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.ConfigurationSystem.Configuration, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Configuration.InstallSystem.Configuration.Install, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.CoreSystem.Core, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.DataSystem.Data, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.DataSetExtensionsSystem.Data.DataSetExtensions, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.LinqSystem.Data.Linq, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.OracleClientSystem.Data.OracleClient, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.SqlXmlSystem.Data.SqlXml, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.DeploymentSystem.Deployment, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.DesignSystem.Design, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.DirectoryServicesSystem.DirectoryServices, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.DirectoryServices.AccountManagementSystem.DirectoryServices.AccountManagement, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.DirectoryServices.ProtocolsSystem.DirectoryServices.Protocols, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.DrawingSystem.Drawing, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Drawing.DesignSystem.Drawing.Design, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.EnterpriseServicesSystem.EnterpriseServices, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.IdentityModelSystem.IdentityModel, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.IdentityModel.SelectorsSystem.IdentityModel.Selectors, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.IO.LogSystem.IO.Log, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.ManagementSystem.Management, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Management.AutomationSystem.Management.Automation, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Management.Automation.ResourcesSystem.Management.Automation.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
System.Management.InstrumentationSystem.Management.Instrumentation, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.MessagingSystem.Messaging, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.NetSystem.Net, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.PrintingSystem.Printing, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Runtime.RemotingSystem.Runtime.Remoting, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.SerializationSystem.Runtime.Serialization, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.Serialization.Formatters.SoapSystem.Runtime.Serialization.Formatters.Soap, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.SecuritySystem.Security, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.ServiceModelSystem.ServiceModel, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.ServiceModel.InstallSystem.ServiceModel.Install, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.ServiceModel.WasHostingSystem.ServiceModel.WasHosting, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.ServiceModel.WebSystem.ServiceModel.Web, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.ServiceProcessSystem.ServiceProcess, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.SpeechSystem.Speech, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.TransactionsSystem.Transactions, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.WebSystem.Web, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web.ExtensionsSystem.Web.Extensions, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.Extensions.DesignSystem.Web.Extensions.Design, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web.MobileSystem.Web.Mobile, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web.RegularExpressionsSystem.Web.RegularExpressions, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web.ServicesSystem.Web.Services, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Windows.FormsSystem.Windows.Forms, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Windows.PresentationSystem.Windows.Presentation, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Workflow.ActivitiesSystem.Workflow.Activities, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Workflow.ComponentModelSystem.Workflow.ComponentModel, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Workflow.RuntimeSystem.Workflow.Runtime, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.WorkflowServicesSystem.WorkflowServices, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.XmlSystem.Xml, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml.LinqSystem.Xml.Linq, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089
TaskSchedulerTaskScheduler, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
TaskScheduler.ResourcesTaskScheduler.resources, Version=, Culture=en, PublicKeyToken=31bf3856ad364e35
UIAutomationClientUIAutomationClient, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
UIAutomationClientsideProvidersUIAutomationClientsideProviders, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
UIAutomationProviderUIAutomationProvider, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
UIAutomationTypesUIAutomationTypes, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
VSLangProjVSLangProj, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
VSLangProj2VSLangProj2, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
VsWebSite.InteropVsWebSite.Interop, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WebDev.WebHostWebDev.WebHost, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WindowsBaseWindowsBase, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35
WindowsFormsIntegrationWindowsFormsIntegration, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35