我有一个.NET c#应用程序, 业务流程(简短和重点)是:
用户通过Windows身份验证调用我的应用程序。
如果用户是特殊用户" (业务逻辑部分,例如某些帐户管理员),我冒充了一个"主帐户"在对共享文件夹具有读/写权限的活动目录中。
然后我使用模拟的用户上下文创建文件夹和文件 - >这有效。
但是当我尝试启动一个进程(对于那些关心的人来说是bcp.exe)时,我无法让它工作!
在许多尝试失败后,收到许多错误消息,例如"访问被拒绝",
并尝试使用几乎所有Process.ProcessStartInfo()
属性来帮助我以不同的用户身份运行流程,我决定将此作为一个问题发布。
我读过许多博客,建议唯一的方法是使用win32 dll并调用CreateProcessAsUser()方法,但这只是为了复杂,我无法找到任何工作样本。
底线问题:
如果模拟用户在模拟上下文中如何从c#app启动Process(Process.Start)?
我的代码:
private void ExecuteCommand(string backupSource, string backupFilename, string formatFilename)
{
// This works --> Here I'm under impersonated user context
// with read write permissions to the shared folder
if (!Directory.Exists(OutputPath))
{
Directory.CreateDirectory(OutputPath);
}
using (Process p = new Process())
{
p.StartInfo = GetProcessStartInfo(backupSource, backupFilename, formatFilename);
//Here I'm currently getting ""Access Denied" exception"
p.Start();
...
}
}
private ProcessStartInfo GetProcessStartInfo(string backupSource, string backupFilename, string formatFilename)
{
var result = new ProcessStartInfo();
result.UseShellExecute = false;
result.RedirectStandardOutput = true;
result.RedirectStandardError = true;
var file = Path.Combine(PathToExecutable, "bcp.exe");
// @"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\bcp.exe";
result.FileName = file;
result.WorkingDirectory = Path.GetDirectoryName(file);
result.LoadUserProfile = true;
result.Domain = "IMPERSONATED USER DOMAIN";
result.UserName = "IMPERSONATED USER NAME";
var ssPwd = new SecureString();
string password = "IMPERSONATED USER PASSWORD";
for (int x = 0; x < password.Length; x++)
{
ssPwd.AppendChar(password[x]);
}
result.Password = ssPwd;
var backupFullFilename = GetFullFileName(backupFilename);
StringBuilder arguments = new StringBuilder(backupSource);
var formatFullFilename = GetFullFileName(formatFilename);
FormatArguments(arguments, backupFullFilename, formatFullFilename);
var argumentsString = arguments.ToString();
result.Arguments = argumentsString;
return result;
}
编辑#1:
我能够解决&#34;访问被拒绝&#34;例外,通过将模拟用户添加到运行启动进程的应用程序的计算机上的管理员组。
现在,我有一个不同的问题,没有例外,但似乎这个过程没有开始,或者在开始时退出,我得到退出代码1073741502.
我已经阅读过我必须使用原生的win32 api CreateProcessAsUser()而不是System.Diagnostics.Process.Start(),但我不确定这是否属实。
想法?
将不胜感激。