views:

355

answers:

3

In this thread from a year ago it's explained that WriteableBitmap will block read access when any part of it comes from an outside domain - say a free image server.

It's further elaborated upon that this is for "DRM". I guess there's some big threat of someone writing a movie-ripper in Silverlight that includes a movie from another domain and then re-captures it... except for the realization you can just rewrite the bloody xap as it comes down the wire and then it's same-domain! But that's neither here nor there.

Anyway, obviously I'm trying to use WritableBitmap to export a screenshot of the user's current setup; but I'm stopped by this cross-domain issue.

Is there really no supported way to do this in the latest version of Silverlight? No crossdomain.xml or clientaccesspolicy.xml? Isn't this crippling for Silverlight - a giant "Screw You", putting half-hearted security roadblocks in that impede developers but don't stop attackers?

Edit: This question is identical to this question here.

+4  A: 

Your sentiment is shared by many, many devs trying to do this for legit purposes. There are some work-arounds out there, all of them either hacky or bizarro. But this is probably the best one I've seen: Screen Capture in SIlverlight 4.0.

Just read again and saw that you're not looking for a crossdomain.xml solution. This page has some other options (again, no solution out there is "great"): http://betaforums.silverlight.net/forums/t/118030.aspx

Also, not sure if this is an option, but your app as an OOB app will not be restricted to security checks in ClientAccessPolicy.xml or CrossDomain.xml. Is Out-of-Browser an option for you?


EDIT: Upon further review of the post and comments, I believe (Tom, please confirm this) that the need isn't to get a screenshot of the user's instance of the SL app running on their own box (which something like Customer Support in Silverlight would take care of pretty well).

Rather, it is to take picture of the user's screen (same as PrtSc-ish). In this case, it is a lot tougher, but not impossible. Rui show's how he does it here, but it relies on a component already being on a user's machine. Jeremy get's even more creative with Silverlight 4 Hack: Use Native/Desktop CLR Without COM Registration, which would effectively allow access.

Otaku
Being OOB doesn't solve this problem; all it does it relax restrictions relating to sockets and permissions.
Tom Ritter
@Tom Ritter: I guess I'm confused - how doesn't that solve the problem? I guess I should have said "elevated permission OOB".
Otaku
@Otaku Even full Trust OOB doesn't negate WriteableBitmap's DRM Pixel stuff. ClientAccessPolicy/CrossDomain have nothing to do with it - the cross-domain pixel access is independent of them.
Tom Ritter
@Tom Ritter: Okay, based on your response I think I may have been mis-reading your need. Please see edit above.
Otaku
A: 

This WritableBitmap behavior have nothing to do with DRM and everything to do with security. If the screenshot you trying to take shows image element with content from different domain then that domain must have crossdomain.xml file with appropriate permissions. You can contact domain owner and ask them to place crossromain.xml in the root of their domain.

Alternatively, Full-Trust OOB application should do the trick since it doesn't check for crossdomain.xml.

Ok, If you have <Image Source="http://crossdomain.com/someimage.jpg" /> in your visual tree and you try to create WriteableBitmap from it, that WriteableBitmap's pixel access will be locked, crossdomain.xml or not. (Shame on you microsoft). Good news (sorta) is, you can use following workaround: Load image using WebClient; call SetSource on image with stream from OpenReadCompleted handler. Create your WriteableBitmap and notice how Pixels property doesn't throw security exception anymore. Far from ideal, but manageable.

Denis
In the linked thread a Silverlight MVP explicitly says crossdomain.xml does not override the restriction. Have you tested this and confirmed he is wrong?
Tom Ritter
A: 

As explained in the identical question the only way to get silverlight to allow you to get the content out of a Writeable Bitmap without any of the following:

  • Out-of-browser
  • Service/Code/App/Rooted GAC otherwise installed on the user's Machine
  • Elevated Trust

is to proxy the content and trick silverlight into thinking it's all from the same domain.

Tom Ritter