在 Silverlight 4中,提升了信任

分享于 

10分钟阅读

Web开发

  繁體

背景

Silverlight Silverlight在访问 system objects objects权限,现在OOB应用程序访问系统资源的权限明显提高,现在OOB应用程序访问系统资源,如访问Speech Speech Speech Speech Speech。

本质上,要实现这一点,主要的改进是:

  • 微软提供了 Silverlight 4 OOB应用程序,可以申请提升的信任度。

来自受信任的应用程序
你可以配置out-of-browser应用程序以要求提升的信任。 安装后,这些受信任的应用程序可以绕过安全沙箱的某些限制。 例如受信任的应用程序可以访问用户文件并使用无键盘限制的全屏模式。

  • 来自. NET 4.0的一个新概念叫做"绑定",C# 关键字: 动态可以用于在生成时声明一个确定类型在运行时,Microsoft.CSharp.RuntimeBinder 将动态地生成 building building building。

介绍

我的论文将专注于讨论提升的信任,如果你有任何问题,如果你有任何问题,请求提升。

我开发了一个简单的Silverlight OOB演示,它将访问本地系统资源,包括:

  • 让用户选择某个文件,然后将它的复制到独立存储中。
  • 访问独立存储枚举所有文件。
  • 在驱动器下创建一个txt文件: 通过调用" Scripting.FileSystemObject",以及读取它的内容。
  • HKEY_CURRENT_USER 下写入注册表项,在 HKEY_LOCAL_MACHINE 下读取注册表项,使用" WScript.Shell"。
    注释: Silverlight OOB应用程序将不具有对 HKLM,的写入权限,它只具有读权限。
  • 使用" WScript.Shell"运行系统上的另一个可执行文件。
  • Phonate将句子用户输入输入到 textbox

屏幕抓图

在系统上安装之后,它的UI如下所示( 我知道它很糟糕。 抱歉 笑脸 ) :

mainpage.png

实现

只有在浏览器方案的中启用了提升权限因此在我们的Silverlight应用程序中,需要检查当前它是否已经用尽浏览器:

if(Application.Current.IsRunningOutOfBrowser)
 // Access local file, registry, COM, etc.

此外,要调用com对象,我们还需要检查 AutomationFactory 是否可用:

if (AutomationFactory.IsAvailable)

好,我们来看看实现提升权限的代码。

  • 点击按钮-"。用于隔离存储访问权限的复制文件",一个文件打开对话框将弹出,下面的截图:

openfile.png

打开文件对话框后的代码:

OpenFileDialog dlg = new OpenFileDialog 
 { Filter = "All files (*.*)|*.*", Multiselect = true };var dlgResult = dlg.ShowDialog();

读取选定的文件并将它的复制到独立存储中:

IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();foreach (FileInfo file in dlg.Files)
{
 using (Stream fileStream = file.OpenRead())
 {
 using (IsolatedStorageFileStream isoStream =
 new IsolatedStorageFileStream(file.Name, FileMode.Create, iso))
 {
 // Read and write the data block by block until finishwhile (true)
 {
 byte[] buffer = new byte[100001];
 int count = fileStream.Read(buffer, 0, buffer.Length);
 if (count >0)
 {
 isoStream.Write(buffer, 0, count);
 }
 else {
 break;
 }
 }
 }
 }
}

"从独立存储加载文件"的代码:

var isoFiles = 
 from files in IsolatedStorageFile.GetUserStoreForApplication().GetFileNames()
 select files;
  • 在" c:waynetestsl4fsowaynetest.txt"处创建文本文件,请注意: 如果你使用 System.IO.File 做这样的操作,你不会成功,因为提升信任仍然不是直接在很多托管程序集中实现的。 在我的演示中,我使用了 Scripting.FileSystemObject:
privateString folderPath = "C:WayneTestSL4FSO";privateString filePath = "C:WayneTestSL4FsoWayneTest.txt";using (dynamic fso = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
{
 if (!fso.FolderExists(folderPath)) fso.CreateFolder(folderPath);
 dynamic txtFile = fso.CreateTextFile(filePath);
 txtFile.WriteLine("Some text...");
 txtFile.close();
}

P.S。虽然我第一次在 using 语句中使用" dynamic"关键字,但是我有点惊讶,但是不检查它是否实现 IDisposibleusing (dynamic x = 8 ) 然后我得到了这个 笑脸 :

incorrectusing.png

好,让我们回到读取刚刚创建的文本文件的代码实现。

var fileContent = String.Empty;using (dynamic fso = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
{
 dynamic file = fso.OpenTextFile(filePath);
 fileContent = file.ReadAll();
 file.Close();
}
  • 请注意:我们只能拥有注册表写入权限,对于HKCU没有的 HKLM,我们有read权限。
using (dynamic wScript = AutomationFactory.CreateObject("WScript.Shell"))
{
 // Only has write permission to HKCU wScript.RegWrite(@"HKCUSoftwareWayneTestRegValue",
 "SomeStrValue", "REG_SZ");
}
using (dynamic wScript = AutomationFactory.CreateObject("WScript.Shell"))
{
 string dotNetRoot =
 wScript.RegRead(@"HKLMSOFTWAREMicrosoft.NETFrameworkInstallRoot");
}
  • 运行其他本地应用程序
using (dynamic wScript = AutomationFactory.CreateObject("WScript.Shell"))
{
 //Refer WScript.Run at: //http://msdn.microsoft.com/en-us/library/d5fk67ky(v=VS.85).aspx wScript.Run("iexplore http://wayneye.com", 1, true);
}

说明:WScript.Shell.Run 方法可以接受可执行文件,但也接受 *.bat,Windows 脚本主机文件( ,,,。) 或者PowerShell脚本文件等。

注意:如果我尝试通过运行另一个EXE或者脚本文件提升权限,绝对不会成功,例如我将获得一个指示访问被拒绝的80070005错误代码的错误代码,指示访问:

var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.RegWrite("HKLMSoftwareWayneTestValue", 1,"REG_BINARY");
WshShell.Close();

80070005.png

如果双击 Demo.js,你将成功,因为你是 Windows 管理员,而"基于的应用程序以部分信任运行,这意味着它们在安全沙箱中运行"。 有关更多信息,请参见信任应用程序应用程序。

  • Phonate一个句子
using (dynamic speechApi = AutomationFactory.CreateObject("Sapi.SpVoice"))
{
 speechApi.Speak(this.txtPhonateSource.Text);
}
  • 实现关闭按钮"x"的代码出现在上面的右上角。
using (var wScript = AutomationFactory.CreateObject("WScript.Shell"))
{
 wScript.Run(@"cmd/k taskkill/IM sllauncher.exe & exit", 0);
}

我发现这一点有点棘手,我在谷歌上搜索了一篇文章,找到了一篇以编程方式退出 Silverlight 4 Out-of-browser应用程序的文章。 实际上,代码调用 WScript.Shell 并运行cmd并终止 sllauncher.exe,这样我们的OOB进程就会被终止 用舌头微笑

结束语

使用using应用程序的信任,我们可以做更多的事情,它为开发企业业务应用程序提供了更多信心。 昨天,我看到 Scott Guthrie发布了一篇关于Silverlight插件的博客,他提到微软将继续努力为企业业务应用程序开发 Silverlight,并将它的应用于。

引用


相关文章