我需要帮助的操作是从 Intranet 网页在自己的服务器磁盘上执行 EXE 文件,该 IIS 位于同一服务器安装上。该网页使用业务层执行 ProcessStart 以及给定的参数。
当我从 web 执行执行时,任务管理器向我显示应用程序正在以用户身份启动网页的 IIS AppPool。几秒钟后它被杀死了。在我的数据库日志中,我可以看到;
The Microsoft Jet database engine cannot open the file '\\computer\pathfile.ext'. It is already opened exclusively by another user, or you need permission to view its data.
这是正确的。反过来,EXE 工具从其他计算机加载文件。这是一种特殊的行为,在使用桌面工具时经过充分研究并且工作良好。
我的目标/问题,
我希望这个网络功能调用具有桌面权限。有可能吗?
IIS AppPool 使用帐户 ApplicationPoolIdentity 进行常规设置。我似乎是“幸运的不明智”,不知道自 <=IIS6 以来 IIS 7.5 和 Windows Server 2008 R2 提升了多少安全模型。
我试图将应用程序池用户更改为 NetworkService,管理员。
我尝试将应用程序池设置为执行/读取权限
我什至尝试让 webapp 运行批处理文件并调用内部应用程序..
然后我开始改变 ProcessStart 行为。在这里,我不知道该怎么做。我试图添加动词 runas。强制密码提示不是这里的解决方案。我试图模拟用户名/密码。那里没有运气。在桌面命令窗口中使用过 /savecred 后,我还尝试使用 ProcessStart 添加 runas /user: blabla 作为参数。那里没有运气。
也许这应该可行,但我只是不明白属性的正确设置。我在下面添加了 ProcessStart 代码片段,还添加了一些注释代码,让您看看我尝试了什么。
public string RunProcess(ApplicationType type, int param)
{
currentSelection = GetApplicationType(type);
ProcessStartInfo info = new ProcessStartInfo(currentSelection.Path);
info.CreateNoWindow = false;
info.UseShellExecute = true;
//info.UseShellExecute = false;
//info.ErrorDialog = false;
//info.UserName = "dummyUsEr";
//info.Password = this.SecurePwd("DummyPWd");
info.WindowStyle = ProcessWindowStyle.Normal;
info.Arguments = string.Format(" {0}", param.ToString());
using (Process exec = Process.Start(info))
{
try
{
exec.WaitForExit();
}
catch
{
}
}
return output;
}
编辑
为了清楚起见,也许可以帮助其他一些人/女孩浏览这个问题,我附上了密码生成的片段,
protected System.Security.SecureString SecurePwd(string pwd)
{
SecureString securePwd = new SecureString();
foreach (char ch in pwd.ToCharArray())
securePwd.AppendChar(ch);
return securePwd;
}