使用模拟阅读图像

时间:2013-11-22 01:53:50

标签: wpf impersonation bitmapimage

我试图从限制访问的位置读取图像并将其返回到我的wpf应用程序中的属性。问题是我似乎无法解决这个错误: A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll Additional information: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

以下是代码:

public BitmapImage GetImage()
{
    var bitmap = new BitmapImage();
    var impersonation = new ImpersonationManager(Resources.Username,
                Resources.Domain,
                Resources.Password);
    using (impersonation.SafeTokenHandle)
    {
        using (var newId = new WindowsIdentity(impersonation.SafeTokenHandle.DangerousGetHandle()))
        {
            using (newId.Impersonate())
            {
                bitmap.BeginInit();
                bitmap.UriSource = new Uri(@"\\restrictedpath\\to\\image.jpg", UriKind.Absolute);
                bitmap.EndInit();
            }
        }
    }
    return bitmap;
}

我正在运行此应用程序的Windows用户无法访问restrictedpath,但我用于模仿的信誉很好,否则模仿效果很好。 ImpersonationManager只是一个包装器。

这可能吗?

1 个答案:

答案 0 :(得分:0)

所以,如果有人碰到这个,我确实弄明白了。我必须打开一个流来读取文件,然后将其分配给位图的流源:

public BitmapImage GetImage()
{
    var bitmap = new BitmapImage();

    var impersonation = new ImpersonationManager(Resources.Username,
                Resources.Domain,
                Resources.Password);
    using (impersonation.SafeTokenHandle)
    using (var newId = new WindowsIdentity(impersonation.SafeTokenHandle.DangerousGetHandle()))
    using (newId.Impersonate())
    {
        using (Stream stream = File.OpenRead(@"\\restrictedpath\\to\\image.jpg"))
        {
            bitmap.BeginInit();
            stream.Flush();
            stream.Position = 0;
            bitmap.StreamSource = stream;
            bitmap.CacheOption = BitmapCacheOption.OnLoad;
            bitmap.EndInit();
            bitmap.Freeze();
        }
    }

    return bitmap;
}

那和bitmap.Freeze()处理了我的问题。