gpt4 book ai didi

c# - 在另一个用户的凭据下启动进程

转载 作者:可可西里 更新时间:2023-11-01 13:50:43 26 4
gpt4 key购买 nike

我想在另一个用户名的凭据下启动一个进程。这就是我现在拥有的:

        /// <summary>
/// Do actions under another username's credentials
/// </summary>
/// <param name="username">Username to inpersonate</param>
/// <param name="domain">Domain/Machine</param>
/// <param name="password">Password </param>
public static void Action(string username,string domain, string password )
{
try
{
if (LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref hToken))
{
if (DuplicateToken(hToken, 2, ref hTokenDuplicate))
{

WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);

WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();

// Check the identity but it could do any other action under given username credentials
try
{
ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardError = true;
info.RedirectStandardOutput = true;
info.UserName = "dummy"; // see the link mentioned at the top
// Define the string value to assign to a new secure string.
char[] chars = { 'p', 'a', 's', 's','1','2','3','4','/' };
// Instantiate the secure string.
SecureString testString = new SecureString();
// Assign the character array to the secure string.
foreach (char ch in chars)
testString.AppendChar(ch);

info.Password = testString;

Process.Start(info);

}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred :{0},{1}",ex.Message, ex.StackTrace.ToString());
}

// Stop impersonating the user
impersonationContext.Undo();
}
}
// Free the tokens
if (hToken != IntPtr.Zero)
CloseHandle(hToken);
if (hTokenDuplicate != IntPtr.Zero)
CloseHandle(hTokenDuplicate);

}catch(Exception ex)
{
Console.WriteLine("Exception occurred. " + ex);
}

它似乎不起作用,我收到“访问被拒绝”的提示。关于如何做的任何想法?如果我们要求凭据,我们会得到正确的凭据,因此它应该在该凭据下执行任何程序。即:

               if (DuplicateToken(hToken, 2, ref hTokenDuplicate))
{

WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();

// Check the identity but it could do any other action under given username credentials
Console.WriteLine("After impersonation: {0}", WindowsIdentity.GetCurrent().Name);

// Stop impersonating the user
impersonationContext.Undo();
}

答案是正确的,我们得到了“虚拟”。

我们可以让它更简单:

 public static void Run()
{
try
{
const string file = "cmd.exe";

var sspw = new SecureString();

foreach (var c in "pass1234/")
sspw.AppendChar(c);

var proc = new Process();

proc.StartInfo.UseShellExecute = false;

proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(file);

proc.StartInfo.FileName = Path.GetFileName(file);

proc.StartInfo.Domain = "WIN08";
proc.StartInfo.Arguments = "";
proc.StartInfo.UserName = "dummy";
proc.StartInfo.Password = sspw;
proc.StartInfo.LoadUserProfile = false;
proc.Start();
}catch(Exception e)
{
Console.WriteLine(e);
}

但是,我仍然遇到异常......

最佳答案

对于某些人来说这可能很奇怪,我很抱歉,我是 Linux 开发人员......测试:

    /// <summary>
/// Class that deals with another username credentials
/// </summary>
class Credentials
{
/// <summary>
/// Constructor of SecureString password, to be used by RunAs
/// </summary>
/// <param name="text">Plain password</param>
/// <returns>SecureString password</returns>
private static SecureString MakeSecureString(string text)
{
SecureString secure = new SecureString();
foreach (char c in text)
{
secure.AppendChar(c);
}

return secure;
}

/// <summary>
/// Run an application under another user credentials.
/// Working directory set to C:\Windows\System32
/// </summary>
/// <param name="path">Full path to the executable file</param>
/// <param name="username">Username of desired credentials</param>
/// <param name="password">Password of desired credentials</param>
public static void RunAs(string path, string username, string password)
{
try
{
ProcessStartInfo myProcess = new ProcessStartInfo(path);
myProcess.UserName = username;
myProcess.Password = MakeSecureString(password);
myProcess.WorkingDirectory = @"C:\Windows\System32";
myProcess.UseShellExecute = false;
Process.Start(myProcess);
}
catch (Win32Exception w32E)
{
// The process didn't start.
Console.WriteLine(w32E);
}
}

}

关于c# - 在另一个用户的凭据下启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com