1

我需要帮助的操作是从 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;
}
4

1 回答 1

0

我看到您已尝试为进程启动模拟输入特定的用户名和密码,但您说该进程访问另一台计算机上的文件,我没有看到任何提及指定域名的内容,大概您需要访问远程文件?
所以像这样:

info.Domain = "domainname";
info.UserName = "dummyUsEr";
info.Password = "DummyPWd";

另外, this.SecurePwd() 有什么作用,您是否仅使用传递给它的直接密码字符串进行了尝试?

于 2012-06-01T08:46:44.970 回答