使用模拟读取图像

Posted

技术标签:

【中文标题】使用模拟读取图像【英文标题】:Reading image using impersonation 【发布时间】:2013-11-22 01:53:50 【问题描述】:

我正在尝试从访问受限的位置读取图像并将其返回到我的 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 只是一个包装器。

这可能吗?

【问题讨论】:

URI 不会那样工作。它需要有一个像"C:\\restrictedpath\\to\\image.jpg" 这样的驱动器号,或者更好的是@"C:\restrictedpath\to\image.jpg"。然而,这并不能解释异常。 @Clemens 嗯,不是真的-UNC 路径工作得很好...否则您将如何访问未映射的共享驱动器?并且此代码在减去异常后工作正常。如果我可以访问该驱动器,一切都很好。完全同意@ 我从真实代码中修补了这个示例并错过了。 如果是UNC路径,你应该写@"\\restrictedpath\to\image.jpg",其中restrictedpath是服务器名,对吧? 是的,没错。就像我说的那样,我用真实的代码编写了这个例子,然后忘记了。 【参考方案1】:

因此,如果有人遇到这种情况,我确实想通了。我必须打开一个流来读取文件,然后将其分配给位图的流源:

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() 解决了我的问题。

【讨论】:

以上是关于使用模拟读取图像的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像

SecurityException:权限拒绝:读取(仅在模拟器上)

从绝对 URL 读取图像文件时的 ENCODING_ERR

如何在脚本中读取不规则编号的数据文件以制作 gnuplot 图像?

React Native iOS 从应用程序 Documents 文件夹中读取图像

Arduino ESP32 ADC模拟量信号读取