与我之前的问题相关:
我想出了以下方法,我在其中创建了这个WinForms控件:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class ConsoleWindow : Control
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool AllocConsole();
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeConsole();
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int …Run Code Online (Sandbox Code Playgroud) 要求是能够在 Windows 10 上运行自助服务终端应用程序,该应用程序在主机上具有不受限制的功能,可以进行任意系统调用并启动任何类型的应用程序,包括 Appx 和 Win32。自助服务终端应用程序可以完全信任——它可以被认为是一个侧面加载的内部应用程序,用于配备传统键盘和鼠标的机器在公共环境中使用。用户不应能够绕过或逃避自助服务终端应用程序。
分配的访问权限符合总体思路,除了分配的访问权限仅适用于不完全信任的 Appx(无法访问启动 Win32 应用程序所需的 API,等等)。这些限制似乎是设计使然,因此这种方法不太可能成功满足规定的要求。尽管可以将 WPF 应用程序创作为“完全信任”的 Appx,但它在自助服务终端模式下不起作用。
用自定义的(信息亭应用程序)替换 Windows 外壳是可行的,但信息亭应用程序需要能够执行的一些任务需要资源管理器外壳的存在(例如启动 Appx - 需要资源管理器外壳提供的服务) )。
如果可能的话,在锁定屏幕上方运行 Win32 应用程序可能是一个解决方案(我相信这是分配访问权限对其 Appx 的作用)。
以任何正常方式运行应用程序都需要禁用或拦截许多热键组合,包括 [CTRL][Alt][Del],这似乎是一个主要问题/挑战。似乎没有办法阻止用户调用任务管理器或以其他方式绕过应用程序以获得对系统的不安全/无中介访问。
有什么方法可以满足我概述的要求吗?如果是,那么技术是什么以及(如果相关)哪些 API 是该方法的核心?
更新:
尽管可以安装并选择完全信任转换的 WPF AppX 以分配访问权限,但它“不起作用”,因为在事件日志中发现了一些问题,具体而言:应用程序和服务日志 > Microsoft > Windows > 应用程序 > Microsoft-Windows-TWinUI/操作. 观察到的行为是,在用户登录时,会显示一个带有熟悉的 Windows 微调器的蓝屏,该微调器每隔一秒左右闪烁一次,好像正在一遍又一遍地重试某些东西。相关的事件日志消息(所有源“应用程序”)是:
ActivateApplicationForContractByAppIdAsUserWithHost 的 App LockDownSample_y1sem70fxfdf6!LockDownSample for the Windows.Launch contract failed with This app does not support the contract or is not installed..(事件 ID:5985)
应用 LockDownSample_y1sem70fxfdf6!LockDownSample 未注册 Windows.Launch 合同或未安装。(事件 …
我正在构建一个 WPF 工具,它将通过反射分析目标应用程序的程序集。
到目前为止,我一直在使用Assembly.Loadetc. 来加载目标程序集。这没问题,只是它有一些限制:我希望能够重建目标应用程序并“刷新”工具以重新分析新建的程序集。目前这不起作用,因为程序集在加载时被锁定,并且在工具退出之前不会释放。这也阻止了重新加载新建的程序集。
我相信我可以创建一个临时 AppDomain,将程序集加载到其中,执行我想做的反射,然后卸载域。
我遇到的问题是我无法让它工作。我尝试了多种变化并得到了结果,例如:
例如,遵循此处的建议:创建自定义 AppDomain 并向其中添加程序集
我SimpleAssemblyLoader这样创建了一个:
public class SimpleAssemblyLoader : MarshalByRefObject
{
public Assembly Load(string path)
{
ValidatePath(path);
return Assembly.Load(path);
}
public Assembly LoadFrom(string path)
{
ValidatePath(path);
return Assembly.LoadFrom(path);
}
public Assembly UnsafeLoadFrom(string path)
{
ValidatePath(path);
return Assembly.UnsafeLoadFrom(path);
}
private void ValidatePath(string path)
{
if (path == null) throw new ArgumentNullException(nameof(path));
if (!System.IO.File.Exists(path))
throw new ArgumentException($"path \"{path}\" does not exist");
}
}
Run Code Online (Sandbox Code Playgroud)
...并在调用方法中使用它:
private static AppDomain …Run Code Online (Sandbox Code Playgroud) 我的应用程序具有数据绑定只读TextBox功能,作为捕获和显示其“记录的”活动的手段。每次要记录某些内容时,都会将其连接到绑定字符串。这对于有限数量的记录文本来说足够有效,但随着文本数量的增加,它(可以理解)会陷入困境。我在之前的问题中看到了建议:Efficient live log-viewer in WPF和What is a fast way to render a log view in WPF? 使用ListBox. 我可以做到这一点,但我会失去一个很好的功能 - 允许用户选择和复制任意文本块。还有其他解决办法吗?