Windows Feature Installation The Referenced Assembly Could Not Be Found. Error: 0x80073701

My day to day involves a good deal of sysadmin work, mostly Windows networks for small business customers. I ran into the above error on a Dell Server 2016 machine when trying to uninstall Windows components (Hyper-V in this case). This post gave me hint I needed to figure out the root cause, some missing language packs.

Now the original post recommends reinstalling the OS, which is a huge non-starter for me in an environment with a single file/AD server. The long fix starts with uninstalling language packs using the lpksetup tool and then manually removing references to any missing packs under the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackageDetectregistry subkeys. There are lots of them, literally thousands.

Just one of the 7600 registry values that need to be filtered.

I really needed to resolve this, so I spent an hour writing a PowerShell script to run through each subkey value and remove the one’s that referenced a missing language pack. In my case it was a German edition, so we’re searching for the string ‘~de-DE~’ below:

$string = "*~de-DE~*"

$keys = Get-ChildItem -Path "hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackageDetect"

foreach ($key in $keys) {
    (Get-ItemProperty -Path $key.PSPath).psobject.properties |where-object{$_.name -like $string} | Remove-ItemProperty -path $key.PSPath

}

It’s pretty simple, but was frustrating because of the need to get the .psobject.properties. I went through a lot of iterative testing to make sure that I targeted the proper values. Hopefully this helps someone else avoid a reinstallation. After running this script I was able to remove the Windows Hyper-V feature with no problems. I assume that this error was caused by an aborted uninstallation of one of the language packs. I’m not sure how they got on there, but assume that it was a Dell image load or something.

Anyways, cheers!

Exchange Online Bulk Add SMTP Addresses

We are a Microsoft partner and have been standing up a lot of clients on Office 365, the management of which requires a lot of PowerShell use to administer properly. My last boss told me that Microsoft’s move away from the GUI toward PS scripting is what is going to ‘separate the men from the boys’, and I’ve taken this to heart, trying to script out everything as much as possible. Server 2012 has really made improvements over 2008 as far as this goes, and Exchange Online and Office 365 (AKA Microsoft Online Services) are strongly there as well. Sure, there are web interfaces for them, but Microsoft seems to have a habit of changing the navigation and language every few weeks and the GUI has been inconsistent between the business and enterprise plans as well, so the Powershell commands seem be the way to go.

For this most recent job, we had a client who wanted to change domain names, so we stood up the new domain on O365 and configured client workstations for the new accounts. Once that was done we verified the old domain with Microsoft in anticipation of routing the old domain to the new mailboxes. Rather than manually add each additional SMTP address for each user account, I used the following script. Make sure you connect to Exchange Online using remote PowerShell first.


$users = get-user * #Filter your OU appropriately, this was a blanket change for a flat hierarchy.
foreach ($user in $users)
{
$mailbox = get-mailbox $user.identity
$newmailbox = $user.id + "@yourNewDomain.com"
set-mailbox -identity $user.identity -EmailAddresses @{Add=$newmailbox}
}

You can then verify that the changes went correctly with the following:

foreach ($user in $users) {
$mailbox = get-mailbox $user.identity
$mailbox.emailaddresses
write-host  $addresses
}