应用程序域级别模拟

我正在开发一个需要将插件加载到单独的子应用程序域的应用程序。 只有一个插件被加载到一个子应用程序域中。 每个插件都需要不同的Windows标识,并且这些标识与默认(父级)应用程序域中使用的Windows标识不同。 每个插件都会加载一个或多个子插件。

例如,默认应用程序域的标识是Authority Limited(Authority是域名或机器名称)。 两个插件被加载到两个子应用程序域中。 加载的插件的身份是Authority Privileged1和Authority Privileged2。 Authority Privileged1和Authority Privileged2分别具有对数据库Database1和Database2的所有必要访问权限,而Authority Limited无权访问任何上述数据库。

在创建子应用程序域时,我调用System.AppDomain.SetThreadPrincipal方法传递System.Security.Principal.WindowsPrincipal实例。 该实例是从重复用户令牌创建的System.Security.Principal.WindowsIdentity实例创建的(请参阅http://support.microsoft.com/kb/306158)。 由于我在创建WIndowsPrincipal实例时处于默认应用程序域,因此我省略了对WindowsIdentity.Impersonate方法的调用。

我预计设置应用程序域线程主体将足以使加载的插件成功登录到其各自的数据库并执行一些T-SQL语句。 令我惊讶的是,当打开到数据库的连接时,使用WindowsIdentity.GetCurrent()方法返回的值。 该方法返回的值是进程标识或模拟标识。

由于进程标识没有使用数据库所必需的权限,因此不可接受。 因此,冒充必须发挥作用。 但是,模拟必须仅在儿童应用程序域中进行。 每个插件都公开用于执行插件加载和卸载的方法。 我知道我必须在开始时进行模仿,并在这些方法结束时撤消模拟。 但是,模拟必须针对子应用程序域中产生的所有线程完成。 由于每个插件都会加载一个或多个子插件,并且每个插件可能会产生一个或多个线程,因此模拟必须在许多地方执行,而且看起来非常混乱。

是否可以执行一次模仿以便影响子应用程序域中产生的所有线程?

链接地址: http://www.djcxy.com/p/4403.html

上一篇: App Domain Level Impersonation

下一篇: How to remove remote origin/refs/heads/master