Computers, survival, and fun.

So I got an initiation to the new MS store pre-opening through Yelp because our community manager is awesome. I went. It was pretty super. It was even more super when they told me that they could sell me a new Microsoft Band right then. Score!

I got it. They showed off some basics, but didn’t seem to know much about it or the tech behind it. I showed one of them how to fool the more advanced differential momentum sensor to fake steps. On the other hand, the guy there who put the screen protector on knew exactly what he was doing and seemed to understand “gas permeable membrane” as it related to the screen protector.

Speaking of, they have screen protectors made specifically for the devices and seem pretty super. They’ll probably all but insist that you let them put one on before you manhandle the phone. You should probably let them. In the first couple of days of having this thing, I was sure that I’d scratched the face horribly, but it turned out that I only gouged the protector. Not only that, the protector healed over almost ever instance of damage.

The thing is a little big and clunky, but very light. I quickly got to a point where I didn’t notice it much. Like everyone else is doing, I started wearing it “upside down” on the bottom of my wrist. It’s easier to interact with it and read it, since it needs two hands and at least one eye.

One disappointing bit is that the app is phone only, not universal, so you can’t get at all the data from your computer. It’s only on your phone. Lame. There is a desktop app that apparently lets you sync, but you can’t see any data from it. Like others have said, it looks like they had a lot of this stuff half finished and were told that they were releasing in a few days. I’ve noticed that the band software version has updated a couple of times.

Another disappointing bit, and I mean REALLY disappointing, is that it uses a proprietary connector to sync and charge. Someone needs to get slapped for that. I’d have to carry around another cable for their special pet device everywhere I travel. And if something happens to it on the road, I have about a day to get to a microsoft store and replace it (at a nice premium cost of twenty dollars) or my band turns into a wrist weight. Forget slapping, someone should probably be fired for screwing that one up.

I’d really like a better way to read up on it, get news updates, and interact with the development and engineering teams.

The SCCM 2012 SP1 admin console msi doesn’t work for non-interactive installations, even if you specify the DEFAULTSITESERVERNAME and TARGETDIR properties. To fix it, you need to add property for DEFAULTSITESERVERNAME and copy AdminConsoleInstallDir/702 from InstallUISequence to InstallExecuteSequence.

I spent some time fighting with getting the msi to deploy natively without some lame exe managing it. You have to specify the DEFAULTSITESERVERNAME and TARGETDIR as properties (e.g. msiexec /i AdminConsole.msi DEFAULTSITESERVERNAME=sccm.domain.local TARGETDIR=”%PROGRAMFILES%Microsoft Configuration Manager\AdminConsole” /passive), or the install will barf and fail with an error. That’s not acceptable, because the TARGETDIR property is supposed to be managed by the installer based on factors like the target OS architecture. And you shouldn’t have to guess at someone’s attempt to be cute by obfuscating basic stuff like that any way.

The problem is that they made an error when they built the MSI. There is one custom action that is in the InstallUISequence and not InstallExecuteSequence. If you open the MSI in Orca, go to the InstallUISequence, find the line with AdminConsoleInstallDir (its sequence number is 702), you can right click on it and select “copy row”, go to the InstallExecuteSequence, right click anywhere on the element list, and click “paste row(s)”, and save it. That will allow the MSI to run without a UI. It’s obviously an oversight because the previous custom action (CcmSetPrimaryFolder) is in both tables and the custom action has a type value that tells the installer to not run that action in InstallExecuteSequence if it already ran in InstallUISequence.

While you’re editing it, you might also want to add an entry for DEFAULTSITESERVERNAME in the Properties table so you can do thinks like call msi from an installer instance instead of hoping the command line works.

To fix the sccm admin console msi, you need to add property for DEFAULTSITESERVERNAME and copy AdminConsoleInstallDir/702 from InstallUISequence to InstallExecuteSequence.

I spent some time fighting with getting the msi to deploy natively without some lame exe managing it. Even if you specify DEFAULTSITESERVERNAME and TARGETDIR as properties (e.g. msiexec /i AdminConsole.msi DEFAULTSITESERVERNAME=sccm.domain.local TARGETDIR=”%PROGRAMFILES%Microsoft Configuration Manager\AdminConsole” /passive), the install will barf and fail with an error.

The problem is that they made an error when they built the MSI. There is one custom action that is in the InstallUISequence and not InstallExecuteSequence. If you open the MSI in Orca, go to the InstallUISequence, find the line with AdminConsoleInstallDir (its sequence number is 702), you can right click on it and select “copy row”, go to the InstallExecuteSequence, right click anywhere on the element list, and click “paste row(s)”, and save it. That will allow the MSI to run without a UI. It’s obviously an oversight because the previous custom action (CcmSetPrimaryFolder) is in both tables and the custom action has a type value that tells the installer to not run that action in InstallExecuteSequence if it already ran in InstallUISequence.

While you’re editing it, you might also want to add an entry for DEFAULTSITESERVERNAME in the Properties table so you can do thinks like call msi from an installer instance instead of hoping the command line works.

Todd Brix posted some self-congratulatory nonsense on the windows phone team weblog page. I’m pretty sure he’s completely disconnected from reality, and he definitely needs to be called out on it. This was posted as a reply, and it’s going here too.

Yeah I don’t know if I’d go bragging about all that. You guys missed TONS of huge opportunities, spent another year ignoring critical features, and people are starting to see the platforms get MORE fragmented.

As “abm” said, number editing and seamless third party dialing are missing, and a seamless NFC experience is missing too. Here are some more:

No phones with keyboards. That would be great if your target market were twelve year olds browsing instagram, but most of us are power users and business professionals. Having a bluetooth keyboard would be a borderline acceptable stand-in, but that was removed in WP7 and hasn’t come back.

Removing device backups. You can back up a WP7.8 device (though you have to use a hack, which should have clued us in on the team’s negative foresight), but there’s no way to do it to a WP8 device. If you complain about it on the forums, MSFTs will say that there’s text and photo sync!, but there are two huge problems with that. First, there’s no way to verify that, you just have to hope that the stuff is actually getting backed up and hope it comes back when you set up your phone again. Second, it doesn’t back up app settings, start screen layout, and most OS settings. You know, the things that people actually want to back up.

Excessive lockdown on devices. We can’t change the boot loader, we can’t install software that can do many useful things, apps can’t communicate with each other on the device, apps can’t interact directly with the OS, and apps can’t pull most data from the OS. Sure, a few of the excuses about security are reasonable, but there’s no reason the user can’t authorize permissions to allow things like seamless NFC activation or sending/receiving SMS.

Users can’t install downloaded XAPs. What’s the point of downloading them then? Sure like the one phone that takes an SD card can make use of that. Why can’t I do it from skydrive?

Now about the “unifcation”… are you completely disconnected from reality? WP and tablet/desktop windows are almost completely disconnected.

IE in metro is pretty neat. It has tab, favorites, and credential sync across devices and it’s integrated with the desktop favorites and credential stores. That’s pretty useful. IE on WP shares nothing but the name.

Your team is letting Nokia make disruptive cusomtizations to firmware for their phones. The maps app is somewhere between crippled and blocked on new lumias, for example, and there are rumors that the task switcher close functionality is significantly changed after installing lumia black.

Skype on WP shares only a name and login with the desktop. IMs viewed on one device don’t get marked on the other.

You want some unification? How about integrating the SMS experience. I should be able to get a text on any WP device and be able to get a notification, view, and reply to it on my desktop, metro interface, or skydrive page. I should be able to build an app to put that functionality in, too. IE favorites and credentials should sync across devices seamlessly.

So how about you guys open your eyes, stop patting yourselves on the back, and actually build some of this unification that you think you have?

Powershell doesn’t have native functionality to manage reparse points. You can add classes for relevant NET types that will allow you to easily create symlinks and hardlinks and to delete them. One thing to note about removing reparse points is that most admins will be used to just deleting them “del c:\mount\reparse”, for example. If you try that in powershell (with Remove-Item or its alias del) it will complain until you use the -Force and -Recurse parameters. Then it will remove all items under the reparse point and finally remove the reparse point. That behavior is somewhere between annoying and disastrous. To get around it, you can call NET classes directly – if you use “[System.IO.Directory]::Delete($Path)”, it will remove the reparse point without affecting anything else.

Remove-ReparsePoint will check to verify that the target is a reparse point, then will check to see if it’s a file or directory and use the appropriate NET class to delete it.

You might also note that there are a couple of Test-Path cmdlets that specify LiteralPath and ErrorAction. That fits a specific case where you might be trying to mount a volume shadow copy. Test-Path will only recognize those paths if they’re passed as literal, and it will improperly throw an error message telling you not to use them even though it returns an accurate result (it should throw a warning, if anything).

New-ReparsePoint will create a new reparse point. You can even use GLOBALROOT children such as volume shadow copies (protip, start with “Get-WmiObject win32_shadowcopy”, but another post will come later). It will try to determine if the target is a file or directory and create the appropriate reparse point (symlink or hardlink, respectively). If it can’t figure it out correctly, you can use -IsFile or -IsDirectory to force the desired behavior.

Looks like there was an issue in the way my WordPress client posted the script last time, but that post has been fixed. One would think that pasting HTML in a rich text view would HTMLEncode it, but nooooo.

Any way, I’ve updated the function with some more info and streamlined the functionality. Here are some of what’s been improved:

Output includes interface name and interface GUID for systems with multiple wireless NICs.

Improved string conversion for SSID.

Added bssid property for easy grouping and ordering (without this, you’d just see several networks with the same SSID but with no easy way to tell them apart).

Passes all properties (it’s the NativeWifi.Wlan+WlanBssEntry with a couple of note properties added).

In the future, I’ll be expanding this into a module and adding more functions. As before, please note that this uses code from the Managed Wifi API project (http://managedwifi.codeplex.com/) though slightly modified to make it suitable for PowerShell.

So you could use netsh wlan show networks mode=bssid and parse the output. But that’s unreliable. And it is tough to capture it all. The code floating around does not capture multiple BSSIDs in a single SSID, reporting only the last one. So I wrote my own. Okay, I mostly took code others came up with and twisted it to fit my needs. Most of this is from the managed wifi api project on codeplex at http://managedwifi.codeplex.com/. I had to move everything into the same class so powershell could parse it. So here is Get-BSSID.ps1