मैं प्रतिरूपण के तहत Process.Start() का उपयोग करने की कोशिश कर रहा हूं, मेरे पास कुछ दिनों के लिए Google है, अधिकांश उत्तर मैं एएसपीनेट के अधीन था, लेकिन मैं विकास कर रहा हूं विंडो अनुप्रयोग के लिए, इसलिए मुझे मूल कारण खोजने में कठिनाई हो रही है।प्रक्रिया का उपयोग करें। प्रतिरूपण करते समय प्रारंभ करें (विंडो अनुप्रयोग)
यह मेरा impersonate कोड
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
कृपया मुझे सही कर अगर मैं गलत कर रहा हूँ तो इस परिदृश्य में, मैं उपयोगकर्ता नाम के साथ झूठे (और processStartInfo को UseShellExecute स्थापित करने के लिए लगता है कि नहीं कर रहा हूँ और पासवर्ड इनपुट भी?) क्योंकि यह निष्पादन योग्य फ़ाइल (?) के लिए है, और मैं 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
}
क्या आप अपने प्रतिरूपण वर्ग के सभी कोड को पोस्ट कर सकते हैं – Thomas
हाय, उत्तर के लिए thx, मैंने –
प्रश्न में अपनी कक्षा अपडेट की है क्षमा करें मैंने आपके अपडेट को नहीं देखा है, मैं इन दो कार्यान्वयन की तुलना करने की कोशिश करूंगा। – Thomas