A month ago, I was lucky enough to give a presentation on Isolated Applications and Side-by-side Assemblies to an ISV. Later, Maarten asked me if the side-by-side cache was protected by Windows Resource Protection. I checked and answered (“Yes”) but still wished I had a tool to quickly check if a file was protected or not. So I took this opportunity to learn a bit more about Boost:

#include <wtypes.h>

#include <boost/filesystem.hpp>

#include <iostream>

#include <Sfc.h>

 

#pragma comment(lib, "sfc")

 

using namespace boost::filesystem;

using namespace std;

 

int wmain() {

   basic_recursive_directory_iterator<wpath> end_iterator;

   basic_recursive_directory_iterator<wpath> iterator(L"C:\\Windows");

   while (iterator != end_iterator) {

      if (is_regular(iterator->status())) {

         if (!SfcIsFileProtected(NULL, iterator->path().string().c_str()))

            wcout << iterator->path() << endl;

      }

      try {

         ++iterator;

      } catch (basic_filesystem_error<wpath> & e) {

         wcout << L"\n\nException!" << endl

               << e.what() << endl

               << e.path1() << endl;

      }

   }

 

   return 0;

}

 

But as Maarten doesn’t like C++, I decided to look at how to do this with PowerShell 2.0:

 

Add-Type -MemberDefinition '[DllImport("sfc.dll", CharSet = CharSet.Unicode, EntryPoint = "SfcIsFileProtected")] public static extern bool IsFileProtected(IntPtr zero, String filename);' -Name 'WindowsResourceProtection' -Namespace 'Win32'

 

function IsFileProtected {

param([string] $f = $(throw 'Please specify a file'))

return [Win32.WindowsResourceProtection]::IsFileProtected([IntPtr]::Zero, $f)

}

 

gci \Windows -r | ? {!(IsFileProtected($_))}

 

Of course, I guess I could have used SFC.EXE /VERIFYFILE=

But how would I have learned about those other topics then? Eh Maarten?