我觉得我错过了一些显而易见的东西,但我无法弄清楚如何做到这一点.
我有一个ps1脚本,其中定义了一个函数.它调用该函数,然后尝试远程使用它:
function foo
{
Param([string]$x)
Write-Output $x
}
foo "Hi!"
Invoke-Command -ScriptBlock { foo "Bye!" } -ComputerName someserver.example.com -Credential someuser@example.com
Run Code Online (Sandbox Code Playgroud)
这个简短的示例脚本打印出"嗨!" 然后崩溃说"术语'foo'不被识别为cmdlet,函数,脚本文件或可操作程序的名称."
我知道该功能未在远程服务器上定义,因为它不在ScriptBlock中.我可以在那里重新定义它,但我不愿意.我想定义一次该函数并在本地或远程使用它.有没有办法做到这一点?
我在使用带有IIS 6的Web Deploy的appHostConfig提供程序时遇到问题.我没有在文档中看到任何内容,说我不能或者我需要安装额外的东西.
我知道我想在IIS的更高版本中做什么.如果我在IIS 7.5(Windows 7)上运行以下命令,它将创建Default Web Site我在IIS管理器中可以看到的副本.
"C:\Program Files (x86)\IIS\Microsoft Web Deploy V2\msdeploy.exe"
-verb:sync
-source:apphostconfig="Default Web Site"
-dest:apphostconfig="Created from command line"
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在IIS 6(Windows 2003)上执行完全相同的操作时,我收到以下消息:
错误:无法创建"appHostConfig"类型的对象和"默认网站"路径.
错误:发出了一个需要IIS配置系统但系统不可用的命令.确保您使用的是包含配置系统的IIS版本.
我可以在IIS 6中执行此操作,还是需要以不同的方式执行某些操作?
我有一个Web应用程序,可以通过反射加载插件.它目前使用Assembly.LoadFrom()并Activator.CreateInstance()完成这项工作.现在,插件被加载到同一个AppDomain中,可以访问我的应用程序中的任何内容以及我的应用程序可以访问的任何内容.
我正在寻找的是一种限制插件可以出于安全目的访问的类和方法的方法.我想让所有的类和方法在被调用时抛出异常,除非它们被列入白名单.我基本上将API类中的所有函数和一些数据传输对象列入白名单.
我也不希望插件能够自己访问文件系统或数据库.我想我可以在单独的AppDomain中使用信任级别来做到这一点.
有没有人有任何好的想法或资源?这可以通过代码访问安全性或.net 4中新的安全透明代码功能来实现吗?
我有一个连接到许多SQL Server数据库的项目.它们都具有相同的模式,但数据不同.数据基本上由客户分开.当请求进入asp.net应用程序时,它可以告诉需要哪个数据库并设置会话.
我们现在正在做的是为每个客户数据库创建一个新的SessionFactory.这已经好了一段时间,但随着更多的客户,我们正在创建更多的数据库.我们开始遇到内存问题,因为每个工厂都有自己的QueryPlanCache.我写了一篇关于调试内存的帖子.
我想这样做,以便我们有一个SessionFactory使用ConnectionProvider打开与正确数据库的连接.到目前为止我看到的是这样的:
public class DatabaseSpecificConnectionProvider : DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
if (!ThreadConnectionString.HasValue)
return base.GetConnection();
var connection = Driver.CreateConnection();
try
{
connection.ConnectionString = ThreadConnectionString.Value;
connection.Open();
}
catch(DbException)
{
connection.Dispose();
throw;
}
return connection;
}
}
Run Code Online (Sandbox Code Playgroud)
如果只需要一个数据库来处理请求,那么这很有用,因为我可以在启动期间在线程局部变量中设置连接字符串.我遇到麻烦的地方是我有一个需要访问多个数据库的管理员级操作.
由于ConnectionProvider不知道哪个会话正在打开连接,因此无法决定使用哪个会话.我可以在打开会话之前设置一个线程局部变量,但由于会话连接是懒惰打开的,所以有麻烦.
我还需要创建一个CacheProvider来避免缓存分裂.那将会遇到类似的问题.
那么任何想法?或者这只是从NHibernate那里得到的太多了?
编辑:我发现这个答案表明我必须依赖一些我想避免的全球状态.如果我有多个活动会话,我希望ConnectionProvider响应与相应数据库的连接.
编辑2:我倾向于为每个站点始终使用的默认Session创建ConnectionProvider的解决方案.然后,为了连接到其他数据库,我打开连接并传入它.我可以看到的缺点是我不能在辅助会话上使用二级缓存,我将不得不跟踪和关闭连接我.
当我点击个人资料的分享链接时,我收到以下异常.我正在使用NuGet的最新版本,2.0.1.
System.NullReferenceException: Object reference not set to an instance of an object.
at StackExchange.Profiling.Storage.SqlServerStorage.LoadInBatch(DbConnection conn, Object idParameter) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\Storage\SqlServerStorage.cs:line 348
at StackExchange.Profiling.Storage.SqlServerStorage.Load(Guid id) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\Storage\SqlServerStorage.cs:line 297
at StackExchange.Profiling.UI.MiniProfilerHandler.Results(HttpContext context) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\UI\MiniProfilerHandler.cs:line 314
at StackExchange.Profiling.UI.MiniProfilerHandler.ProcessRequest(HttpContext context) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\UI\MiniProfilerHandler.cs:line 188
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Run Code Online (Sandbox Code Playgroud)
我发现,我认为是在代码中的空引用的来源在这里:
ClientTimings clientTimings = null;
if (clientTimingList.Count > 0)
{
clientTimings.Timings = clientTimingList;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么,或者当有条目时总是会抛出异常clientTimingList?
我想也许如果我禁用批处理,我不会运行LoadInBatch函数,但LoadIndividually有同样的问题.
我找了一种方法来禁用客户端计时,但找不到它的设置.
也许我可以在数据库中设置一个触发器来删除行,但这似乎有点极端.
如果我有时间,我会得到代码并提交拉取请求.我想先确保我没有遗漏任何明显的东西.
我正在尝试创建一个沙盒AppDomain来加载扩展/插件.我有一个MarshalByRefObject,它在appdomain中实例化以加载dll.我在尝试加载dll时遇到SecurityExceptions,我无法弄清楚如何绕过它们,同时仍然限制第三方代码可以做什么.我的所有项目都是.net 4.
InDomainLoader类位于完全受信任的域中,该方法标记为SecuritySafeCritical.从我读过的所有内容来看,我认为这应该有效.
这是我的Loader类,它创建AppDomain并跳转到它:
public class Loader
{
public void Load(string dll, string typeName)
{
Log.PrintSecurity();
// Create new AppDomain
var setup = AppDomain.CurrentDomain.SetupInformation;
var permissions = new PermissionSet(null);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
var strongname = typeof(InDomainLoader).Assembly.Evidence.GetHostEvidence<StrongName>();
var strongname2 = typeof(IPlugin).Assembly.Evidence.GetHostEvidence<StrongName>();
AppDomain domain = AppDomain.CreateDomain("plugin", null, setup, permissions, strongname, strongname2);
// Create instance
var loader = (InDomainLoader)domain.CreateInstanceAndUnwrap(
typeof (InDomainLoader).Assembly.FullName, typeof (InDomainLoader).FullName);
// Jump into domain
loader.Load(dll, typeName);
}
}
Run Code Online (Sandbox Code Playgroud)
这是在域中运行的引导加载程序:
public class InDomainLoader : MarshalByRefObject
{
[SecuritySafeCritical]
public void Load(string dll, string …Run Code Online (Sandbox Code Playgroud) c# ×2
appdomain ×1
deployment ×1
iis-6 ×1
msdeploy ×1
nhibernate ×1
plugins ×1
powershell ×1
security ×1
webdeploy ×1