我必须从我们的内部网站运行一个工具。用户将从 UI 提供的输入很少,然后我想使用用户凭据运行该工具。当我从本地计算机运行它时,我的代码工作正常,但是当我将其部署到生产服务器并尝试从那里执行它时,它不会启动任何内容。
这是我的代码,任何建议将不胜感激。
System.Diagnostics.ProcessStartInfo PSI = new System.Diagnostics.ProcessStartInfo(@"D:run.bat");
PSI.UserName = "username";
PSI.Domain = "domain";
System.Security.SecureString securePwd = new System.Security.SecureString();
string password = "password";
foreach (char c in password)
{
// Append the character to the password.
securePwd.AppendChar(c);
}
PSI.Password = securePwd;
PSI.UseShellExecute = false;
process.StartInfo = PSI;
PSI.Arguments = SiteId.Text + " " + WebServiceUrl.Text + " " +LogFile.Text;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
首先:
- 检查应用程序池的标识(高级设置)。
- 将标识切换到"系统",并查看批处理文件是否从 Web 应用运行。
如果是这样:
- 将标识更改回网络服务,
- 确保您的批处理文件具有适用于用户网络服务(或您选择的任何标识)的执行权限
如果没有:
- 尝试使用代码打开文件,并在末尾附加一些无害的文本。
- 如果可行,您至少可以排除权限和 Web 应用可查看性问题。
我想关闭这个线程,因为我从生产服务器运行应用程序的问题解决了。但是我遇到使用特定用户名和密码运行该应用程序的问题。它始终使用应用池中设置的任何标识运行。所以现在如果我只使用这一行,它适用于应用程序池默认标识
Process.Start("notepad");
但是如果我使用这行代码,它甚至不会在该服务器中启动记事本
string password = "XXXXX";
System.Security.SecureString securePwd = new System.Security.SecureString();
foreach (char c in password)
{
// Append the character to the password.
securePwd.AppendChar(c);
}
Process.Start("notepad", "username", securePwd, "domain");
我将就此单独提出一个问题。感谢所有回复的人。