gpt4 book ai didi

c# - 在模拟(窗口应用程序)时使用 Process.Start

转载 作者:太空狗 更新时间:2023-10-29 21:49:20 27 4
gpt4 key购买 nike

我正在尝试在 Impersonation 下使用 Process.Start(),我用谷歌搜索了几天,我遇到的大多数答案都是在 ASP.net 下,但我正在为 Window 应用程序开发,所以我遇到了困难找到根本原因。

这是我的模拟代码

     private void impersonateValidUser(string userName, string domain, string password)
{
WindowsIdentity tempWindowsIdentity = null;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if ( LogonUser( userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if ( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 )
{
tempWindowsIdentity = new WindowsIdentity( tokenDuplicate );
mImpersonationContext = tempWindowsIdentity.Impersonate();
}
}
}

我正在尝试通过我的程序打开文档(无 .exe,例如 .txt、.doc)

    using (new Impersonator(DomainUserID, Domain, Password))
Process.Start(filePath);

到目前为止,我能够检测到模拟用户的目录/文件,这对我当前的登录用户来说是不可见的,因为我没有授予它访问权限。但是每当我尝试打开文档时,都会出现错误

    System.ComponentModel.Win32Exception (0x80004005): Access is denied

如果我错了,请纠正我,所以在这种情况下,我不应该将 UseShellExecute 设置为 false(以及 processStartInfo 是否也输入用户名和密码?),因为它用于可执行文件(?),并且我确实也遇到了 CreateProcessAsUser 函数,但这个函数似乎也不适用于我的情况,从我读到的示例来看,它也是针对 .exe 文件的。

如果有人能启发我,我将不胜感激。

更新:模拟类

public class Impersonator : IDisposable
{
#region P/Invoke

[DllImport("advapi32.dll", SetLastError = true)]
private static extern int LogonUser( string lpszUserName,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int DuplicateToken( IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
#endregion

#region Constants
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_PROVIDER_DEFAULT = 0;
#endregion

#region Attributes
private WindowsImpersonationContext mImpersonationContext = null;
#endregion

#region Public methods.

public Impersonator( string userName, string domainName, string password)
{
impersonateValidUser(userName, domainName, password);
}

#endregion

#region IDisposable member.
public void Dispose()
{
undoImpersonation();
}
#endregion

#region Private member.

private void impersonateValidUser(string userName, string domain, string password)
{
WindowsIdentity tempWindowsIdentity = null;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;

try
{
if ( RevertToSelf() )
{
if ( LogonUser( userName, domain, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if ( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 )
{
tempWindowsIdentity = new WindowsIdentity( tokenDuplicate );
mImpersonationContext = tempWindowsIdentity.Impersonate();
}
else
{
throw new Win32Exception( Marshal.GetLastWin32Error() );
}
}
else
{
throw new Win32Exception( Marshal.GetLastWin32Error() );
}
}
else
{
throw new Win32Exception( Marshal.GetLastWin32Error() );
}
}
finally
{
if ( token != IntPtr.Zero )
{
CloseHandle( token );
}
if ( tokenDuplicate != IntPtr.Zero )
{
CloseHandle( tokenDuplicate );
}
}
}

/// <summary>
/// Reverts the impersonation.
/// </summary>
private void undoImpersonation()
{
if ( mImpersonationContext != null )
{
mImpersonationContext.Undo();
}
}

#endregion
}

最佳答案

模拟时不能使用 UseShellExecute = true。这与 shell 执行在 Windows 中的工作方式有关。基本上一切都传递给 shell,它查找如何处理动词(在您的情况下为“打开”),然后在拥有 shell 的用户下启动应用程序,该用户不是模拟用户 -如果没有 session ,模拟用户实际上没有 shell!

尽管您使用不同的机制来模拟用户 documentation对于 UseShellExecute 仍然适用于您的情况:

UseShellExecute must be false if the UserName property is not null or an empty string, or an InvalidOperationException will be thrown when the Process.Start(ProcessStartInfo) method is called.

要解决此问题,最简单的方法可能是自己查找已注册的应用程序,如以下答案所述:Finding the default application for opening a particular file type on Windows .使用关联应用程序的路径,您可以以其他用户身份启动可执行文件。

关于c# - 在模拟(窗口应用程序)时使用 Process.Start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34330964/

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