Thursday, June 19, 2008

how to determine the assembly evidence at runtime

I ran into a problem the other day, one of the .NET applications we had deployed started crashing on some screens for no apparent reason. The application worked fine in the development environment and when called from the C drive in the test machine.
We tested for binding problems using the SDK tool fuslogvw.exe, but didn't see any binding errors. The other SDK tool we tried was the .NET Framework configuration tool MScorcfg.msc, no luck. As the SDK doesn't ship with the Framework 2.0 we had a trouble to do these tests on every single production machine...let alone that the Configuration tool does not show run-time evidence for a given assembly.
Maybe the enterprise policy had changed for the different zones and this .msi had been pushed without us knowing...
The MScorcfg.msc said otherwise...

This code and extra logs in our application did the trick on determining the evidence passed to the CLR:


private static void LogEvidence()
{

Zone myZone;
Url myURL;
Hash myHash;
Site mySite;

String strEvidence = "";

log(" ===================== Assembly Evidence: ========================= ");


foreach (Object myEvidence in System.Reflection.Assembly.GetExecutingAssembly().Evidence)
{
strEvidence = myEvidence.GetType().ToString();

switch (myEvidence.GetType().ToString())
{
case "System.Security.Policy.Zone":
myZone = (Zone)myEvidence;
strEvidence = strEvidence + ": " + myZone.SecurityZone.ToString();
break;
case "System.Security.Policy.Url":
myURL = (Url)myEvidence;
strEvidence = strEvidence + ": " + myURL.Value;
break;
case "System.Security.Policy.Hash":
myHash = (Hash)myEvidence;
strEvidence = strEvidence + ": " + BitConverter.ToString(myHash.SHA1);
break;
case "System.Security.Policy.Site":
mySite = (Site)myEvidence;
strEvidence = strEvidence + ": " + mySite.Name;
break;
default:
break;
}

log(strEvidence);


}
log(" ===================== End of Assembly Evidence: ==================== ");



}

Labels:

0 Comments:

Post a Comment

<< Home