दिलचस्प पोस्ट
फ़ायरफ़ॉक्स इतिहास में वापस यात्रा के बाद, जावास्क्रिप्ट नहीं चलेगा मैं विंडोज़ / आईआईएस सर्वर पर मौजूदा पृष्ठ का पूरा यूआरएल कैसे प्राप्त करूं? वेक्टर से मैट्रिक्स की गुणा गुणा? सबसे नज़दीक वाली खिड़कियां क्या हैं (कांटा)? SwingUtilities.invokeLater () क्यों इसकी आवश्यकता है? कीस्टोर, प्रमाण पत्र और उपनाम को समझना ट्विटर बूटस्ट्रैप 3 दो कॉलम पूर्ण ऊंचाई मैपफ्रैग्मेंट पर सर्कल का Google मानचित्र एपीआई v2 खींचना एक चर नाम के रूप में एक स्ट्रिंग चर का उपयोग करना QtCreator में opencv को कैसे लिंक करें और क्यूटी लाइब्रेरी का उपयोग करें क्या गीट की पैक स्नैपशॉट्स के बजाय डेल्टा हैं? मावेन अमान्य LOC शीर्षलेख (खराब हस्ताक्षर) एसटीआई, एक नियंत्रक स्ट्रिंग को सी में दो में परिवर्तित करना # फ्रेमवर्क नहीं मिला GoogleToolboxForMac

एक Windows सेवा से एक अलग उपयोगकर्ता के रूप में प्रक्रिया शुरू करने के लिए Process.Start () का उपयोग करना

मैं समय-समय पर किसी विन्डोज सर्विस से एक निर्दिष्ट उपयोगकर्ता खाते के तहत एक मनमाने ढंग से। NET EXE चलाता हूं।

अब तक मुझे मेरी खिड़कियों की सेवा को तर्क के साथ चल रहा है कि यह निर्णय क्या है, और इसे कब चलाना है। लक्ष्य प्रक्रिया निम्न तरीके से शुरू की गई है:

  1. "प्रशासक" क्रेडेंशियल्स का उपयोग करना शुरू कर दिया गया है।
  2. जब समय आता है, तो एक मध्यवर्ती .NET प्रक्रिया तर्कों के साथ निष्पादित होती है, जिसमें बताई गई प्रक्रिया (फ़ाइल नाम, उपयोगकर्ता नाम, डोमेन, पासवर्ड) के बारे में बताता है।
  3. यह प्रक्रिया एक नई प्रणाली बनाता है। डायग्नोस्टिक्स। प्रोसेस, उसके पास दिए गए तर्कों से भरा एक ProcessStartInfo ऑब्जेक्ट संबद्ध करता है, और फिर प्रक्रिया ऑब्जेक्ट पर प्रारंभ () को कॉल करता है।

ऐसा पहली बार होता है, लक्ष्य प्रक्रिया ठीक निष्पादित होती है और फिर सामान्य रूप से बंद हो जाती है । हर बाद के समय हालांकि, जैसे ही लक्ष्य प्रक्रिया शुरू की जा रही है, यह त्रुटि को फेंकता है "अनुप्रयोग ठीक से (0xc0000142) को विलीन करने में विफल रहा" Windows सेवा को पुनरारंभ करने से प्रक्रिया को एक बार फिर सफलतापूर्वक चलाने की अनुमति मिलेगी (पहली निष्पादन के लिए)।

स्वाभाविक रूप से, लक्ष्य को लक्ष्य प्रक्रिया हर बार सफलतापूर्वक निष्पादित करना है।

उपरोक्त चरण 2 के बारे में: एक अलग उपयोगकर्ता के रूप में एक प्रक्रिया चलाने के लिए .NET Win32 फ़ंक्शन को CreateProcessWithLogonW कहता है। इस फ़ंक्शन के लिए निर्दिष्ट उपयोगकर्ता को लॉग इन करने के लिए विंडो हैंडल की आवश्यकता है। चूंकि Windows सेवा इंटरएक्टिव मोड में नहीं चल रही है इसलिए इसमें कोई विंडो हैंडल नहीं है। यह मध्यवर्ती प्रक्रिया इस मुद्दे को हल करती है, क्योंकि इसमें एक विंडो हैंडल है जिसे लक्ष्य प्रक्रिया में पारित किया जा सकता है।

कृपया, psexec या windows कार्य योजनाकार का उपयोग करने का कोई सुझाव नहीं। मैंने अपनी ज़िंदगी को स्वीकार कर लिया है, और इसमें समस्या को सुलझाने के तरीके को ऊपर वर्णित किया गया है।

वेब के समाधान से एकत्रित समाधान "एक Windows सेवा से एक अलग उपयोगकर्ता के रूप में प्रक्रिया शुरू करने के लिए Process.Start () का उपयोग करना"

मुझे निम्न परिदृश्यों के लिए कार्यशील कार्यान्वयन (मेरी मशीन (टीएम) पर काम करता है) लगता है:

बैच फ़ाइल, .NET कंसोल असेंबली, .NET विंडोज फॉर्म्स अनुप्रयोग।

ऐसे:

मेरे पास प्रशासक उपयोगकर्ता के रूप में चलने वाली एक विंडोज़ सेवा है मैं प्रशासक उपयोगकर्ता को निम्नलिखित नीतियां जोड़ता हूं:

  • एक सेवा के रूप में लॉग ऑन करें
  • ऑपरेटिंग सिस्टम के भाग के रूप में कार्य करें
  • एक प्रक्रिया के लिए मेमोरी कोटे समायोजित करें
  • एक प्रक्रिया स्तर टोकन बदलें

ये नीतियां नियंत्रण कक्ष / प्रशासनिक उपकरण / स्थानीय सुरक्षा नीति / उपयोगकर्ता अधिकार असाइनमेंट खोलकर जोड़ सकते हैं। एक बार सेट होने पर, अगले लॉगिन तक नीतियां प्रभावी नहीं होतीं आप प्रशासक के बजाय दूसरे उपयोगकर्ता का उपयोग कर सकते हैं, जो चीजों को थोड़ा सुरक्षित बना सकते हैं 🙂

अब, मेरी खिड़कियों की सर्विस में अन्य उपयोगकर्ताओं के रूप में काम शुरू करने के लिए आवश्यक अनुमतियां हैं। जब एक सेवा शुरू करने की जरूरत है एक अलग विधानसभा ("स्टार्टर" .नेट कंसोल असेंबली) जो मेरे लिए प्रक्रिया शुरू की

विंडो सेवा में स्थित निम्न कोड मेरे "स्टार्टर" कंसोल असेंबल को कार्यान्वित करता है:

Process proc = null; System.Diagnostics.ProcessStartInfo info; string domain = string.IsNullOrEmpty(row.Domain) ? "." : row.Domain; info = new ProcessStartInfo("Starter.exe"); info.Arguments = cmd + " " + domain + " " + username + " " + password + " " + args; info.WorkingDirectory = Path.GetDirectoryName(cmd); info.UseShellExecute = false; info.RedirectStandardError = true; info.RedirectStandardOutput = true; proc = System.Diagnostics.Process.Start(info); 

कंसोल असेंबली तब इंटरॉप कॉल के माध्यम से लक्ष्य प्रक्रिया शुरू करती है:

 class Program { #region Interop [StructLayout(LayoutKind.Sequential)] public struct LUID { public UInt32 LowPart; public Int32 HighPart; } [StructLayout(LayoutKind.Sequential)] public struct LUID_AND_ATTRIBUTES { public LUID Luid; public UInt32 Attributes; } public struct TOKEN_PRIVILEGES { public UInt32 PrivilegeCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public LUID_AND_ATTRIBUTES[] Privileges; } enum TOKEN_INFORMATION_CLASS { TokenUser = 1, TokenGroups, TokenPrivileges, TokenOwner, TokenPrimaryGroup, TokenDefaultDacl, TokenSource, TokenType, TokenImpersonationLevel, TokenStatistics, TokenRestrictedSids, TokenSessionId, TokenGroupsAndPrivileges, TokenSessionReference, TokenSandBoxInert, TokenAuditPolicy, TokenOrigin, TokenElevationType, TokenLinkedToken, TokenElevation, TokenHasRestrictions, TokenAccessInformation, TokenVirtualizationAllowed, TokenVirtualizationEnabled, TokenIntegrityLevel, TokenUIAccess, TokenMandatoryPolicy, TokenLogonSid, MaxTokenInfoClass } [Flags] enum CreationFlags : uint { CREATE_BREAKAWAY_FROM_JOB = 0x01000000, CREATE_DEFAULT_ERROR_MODE = 0x04000000, CREATE_NEW_CONSOLE = 0x00000010, CREATE_NEW_PROCESS_GROUP = 0x00000200, CREATE_NO_WINDOW = 0x08000000, CREATE_PROTECTED_PROCESS = 0x00040000, CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000, CREATE_SEPARATE_WOW_VDM = 0x00001000, CREATE_SUSPENDED = 0x00000004, CREATE_UNICODE_ENVIRONMENT = 0x00000400, DEBUG_ONLY_THIS_PROCESS = 0x00000002, DEBUG_PROCESS = 0x00000001, DETACHED_PROCESS = 0x00000008, EXTENDED_STARTUPINFO_PRESENT = 0x00080000 } public enum TOKEN_TYPE { TokenPrimary = 1, TokenImpersonation } public enum SECURITY_IMPERSONATION_LEVEL { SecurityAnonymous, SecurityIdentification, SecurityImpersonation, SecurityDelegation } [Flags] enum LogonFlags { LOGON_NETCREDENTIALS_ONLY = 2, LOGON_WITH_PROFILE = 1 } enum LOGON_TYPE { LOGON32_LOGON_INTERACTIVE = 2, LOGON32_LOGON_NETWORK, LOGON32_LOGON_BATCH, LOGON32_LOGON_SERVICE, LOGON32_LOGON_UNLOCK = 7, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_LOGON_NEW_CREDENTIALS } enum LOGON_PROVIDER { LOGON32_PROVIDER_DEFAULT, LOGON32_PROVIDER_WINNT35, LOGON32_PROVIDER_WINNT40, LOGON32_PROVIDER_WINNT50 } #region _SECURITY_ATTRIBUTES //typedef struct _SECURITY_ATTRIBUTES { // DWORD nLength; // LPVOID lpSecurityDescriptor; // BOOL bInheritHandle; //} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; #endregion struct SECURITY_ATTRIBUTES { public uint Length; public IntPtr SecurityDescriptor; public bool InheritHandle; } [Flags] enum SECURITY_INFORMATION : uint { OWNER_SECURITY_INFORMATION = 0x00000001, GROUP_SECURITY_INFORMATION = 0x00000002, DACL_SECURITY_INFORMATION = 0x00000004, SACL_SECURITY_INFORMATION = 0x00000008, UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000, UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000, PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000, PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000 } #region _SECURITY_DESCRIPTOR //typedef struct _SECURITY_DESCRIPTOR { // UCHAR Revision; // UCHAR Sbz1; // SECURITY_DESCRIPTOR_CONTROL Control; // PSID Owner; // PSID Group; // PACL Sacl; // PACL Dacl; //} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR; #endregion [StructLayoutAttribute(LayoutKind.Sequential)] struct SECURITY_DESCRIPTOR { public byte revision; public byte size; public short control; // public SECURITY_DESCRIPTOR_CONTROL control; public IntPtr owner; public IntPtr group; public IntPtr sacl; public IntPtr dacl; } #region _STARTUPINFO //typedef struct _STARTUPINFO { // DWORD cb; // LPTSTR lpReserved; // LPTSTR lpDesktop; // LPTSTR lpTitle; // DWORD dwX; // DWORD dwY; // DWORD dwXSize; // DWORD dwYSize; // DWORD dwXCountChars; // DWORD dwYCountChars; // DWORD dwFillAttribute; // DWORD dwFlags; // WORD wShowWindow; // WORD cbReserved2; // LPBYTE lpReserved2; // HANDLE hStdInput; // HANDLE hStdOutput; // HANDLE hStdError; //} STARTUPINFO, *LPSTARTUPINFO; #endregion struct STARTUPINFO { public uint cb; [MarshalAs(UnmanagedType.LPTStr)] public string Reserved; [MarshalAs(UnmanagedType.LPTStr)] public string Desktop; [MarshalAs(UnmanagedType.LPTStr)] public string Title; public uint X; public uint Y; public uint XSize; public uint YSize; public uint XCountChars; public uint YCountChars; public uint FillAttribute; public uint Flags; public ushort ShowWindow; public ushort Reserverd2; public byte bReserverd2; public IntPtr StdInput; public IntPtr StdOutput; public IntPtr StdError; } #region _PROCESS_INFORMATION //typedef struct _PROCESS_INFORMATION { // HANDLE hProcess; // HANDLE hThread; // DWORD dwProcessId; // DWORD dwThreadId; } // PROCESS_INFORMATION, *LPPROCESS_INFORMATION; #endregion [StructLayout(LayoutKind.Sequential)] struct PROCESS_INFORMATION { public IntPtr Process; public IntPtr Thread; public uint ProcessId; public uint ThreadId; } [DllImport("advapi32.dll", SetLastError = true)] static extern bool InitializeSecurityDescriptor(IntPtr pSecurityDescriptor, uint dwRevision); const uint SECURITY_DESCRIPTOR_REVISION = 1; [DllImport("advapi32.dll", SetLastError = true)] static extern bool SetSecurityDescriptorDacl(ref SECURITY_DESCRIPTOR sd, bool daclPresent, IntPtr dacl, bool daclDefaulted); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] extern static bool DuplicateTokenEx( IntPtr hExistingToken, uint dwDesiredAccess, ref SECURITY_ATTRIBUTES lpTokenAttributes, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, TOKEN_TYPE TokenType, out IntPtr phNewToken); [DllImport("advapi32.dll", SetLastError = true)] public static extern bool LogonUser( string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken ); #region GetTokenInformation //BOOL WINAPI GetTokenInformation( // __in HANDLE TokenHandle, // __in TOKEN_INFORMATION_CLASS TokenInformationClass, // __out_opt LPVOID TokenInformation, // __in DWORD TokenInformationLength, // __out PDWORD ReturnLength //); #endregion [DllImport("advapi32.dll", SetLastError = true)] static extern bool GetTokenInformation( IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, int TokenInformationLength, out int ReturnLength ); #region CreateProcessAsUser // BOOL WINAPI CreateProcessAsUser( // __in_opt HANDLE hToken, // __in_opt LPCTSTR lpApplicationName, // __inout_opt LPTSTR lpCommandLine, // __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, // __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, // __in BOOL bInheritHandles, // __in DWORD dwCreationFlags, // __in_opt LPVOID lpEnvironment, // __in_opt LPCTSTR lpCurrentDirectory, // __in LPSTARTUPINFO lpStartupInfo, // __out LPPROCESS_INFORMATION lpProcessInformation); #endregion [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] static extern bool CreateProcessAsUser( IntPtr Token, [MarshalAs(UnmanagedType.LPTStr)] string ApplicationName, [MarshalAs(UnmanagedType.LPTStr)] string CommandLine, ref SECURITY_ATTRIBUTES ProcessAttributes, ref SECURITY_ATTRIBUTES ThreadAttributes, bool InheritHandles, uint CreationFlags, IntPtr Environment, [MarshalAs(UnmanagedType.LPTStr)] string CurrentDirectory, ref STARTUPINFO StartupInfo, out PROCESS_INFORMATION ProcessInformation); #region CloseHandle //BOOL WINAPI CloseHandle( // __in HANDLE hObject // ); #endregion [DllImport("Kernel32.dll")] extern static int CloseHandle(IntPtr handle); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen); [DllImport("advapi32.dll", SetLastError = true)] internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid); [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } //static internal const int TOKEN_QUERY = 0x00000008; internal const int SE_PRIVILEGE_ENABLED = 0x00000002; //static internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; internal const int TOKEN_QUERY = 0x00000008; internal const int TOKEN_DUPLICATE = 0x0002; internal const int TOKEN_ASSIGN_PRIMARY = 0x0001; #endregion [STAThread] static void Main(string[] args) { string username, domain, password, applicationName; username = args[2]; domain = args[1]; password = args[3]; applicationName = @args[0]; IntPtr token = IntPtr.Zero; IntPtr primaryToken = IntPtr.Zero; try { bool result = false; result = LogonUser(username, domain, password, (int)LOGON_TYPE.LOGON32_LOGON_NETWORK, (int)LOGON_PROVIDER.LOGON32_PROVIDER_DEFAULT, out token); if (!result) { int winError = Marshal.GetLastWin32Error(); } string commandLine = null; #region security attributes SECURITY_ATTRIBUTES processAttributes = new SECURITY_ATTRIBUTES(); SECURITY_DESCRIPTOR sd = new SECURITY_DESCRIPTOR(); IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(sd)); Marshal.StructureToPtr(sd, ptr, false); InitializeSecurityDescriptor(ptr, SECURITY_DESCRIPTOR_REVISION); sd = (SECURITY_DESCRIPTOR)Marshal.PtrToStructure(ptr, typeof(SECURITY_DESCRIPTOR)); result = SetSecurityDescriptorDacl(ref sd, true, IntPtr.Zero, false); if (!result) { int winError = Marshal.GetLastWin32Error(); } primaryToken = new IntPtr(); result = DuplicateTokenEx(token, 0, ref processAttributes, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, out primaryToken); if (!result) { int winError = Marshal.GetLastWin32Error(); } processAttributes.SecurityDescriptor = ptr; processAttributes.Length = (uint)Marshal.SizeOf(sd); processAttributes.InheritHandle = true; #endregion SECURITY_ATTRIBUTES threadAttributes = new SECURITY_ATTRIBUTES(); threadAttributes.SecurityDescriptor = IntPtr.Zero; threadAttributes.Length = 0; threadAttributes.InheritHandle = false; bool inheritHandles = true; //CreationFlags creationFlags = CreationFlags.CREATE_DEFAULT_ERROR_MODE; IntPtr environment = IntPtr.Zero; string currentDirectory = currdir; STARTUPINFO startupInfo = new STARTUPINFO(); startupInfo.Desktop = ""; PROCESS_INFORMATION processInformation; result = CreateProcessAsUser(primaryToken, applicationName, commandLine, ref processAttributes, ref threadAttributes, inheritHandles, 16, environment, currentDirectory, ref startupInfo, out processInformation); if (!result) { int winError = Marshal.GetLastWin32Error(); File.AppendAllText(logfile, DateTime.Now.ToLongTimeString() + " " + winError + Environment.NewLine); } } catch { int winError = Marshal.GetLastWin32Error(); File.AppendAllText(logfile, DateTime.Now.ToLongTimeString() + " " + winError + Environment.NewLine); } finally { if (token != IntPtr.Zero) { int x = CloseHandle(token); if (x == 0) throw new Win32Exception(Marshal.GetLastWin32Error()); x = CloseHandle(primaryToken); if (x == 0) throw new Win32Exception(Marshal.GetLastWin32Error()); } } } 

बुनियादी प्रक्रिया है:

  1. उपयोगकर्ता को लॉग ऑन करें
  2. दिए गए टोकन को एक प्राथमिक टोकन में कनवर्ट करें
  3. इस टोकन का उपयोग, प्रक्रिया को निष्पादित करें
  4. समाप्त होने पर संभाल बंद करें

यह मेरा मशीन से ताजा ताजा विकास कोड है और उत्पादन वातावरण में उपयोग के लिए तैयार नहीं है। यहां पर कोड अभी भी छोटी है – शुरुआती के लिए: मुझे यकीन नहीं है कि हैंडल सही बिंदु पर बंद हैं, और इसके ऊपर परिभाषित कुछ इंटरॉप फ़ंक्शंस आवश्यक नहीं हैं। अलग स्टार्टर प्रक्रिया भी सचमुच मुझे परेशान करती है आदर्श रूप से मैं यह चाहता हूं कि हमारे एपीआई के उपयोग के साथ-साथ इस सेवा के उपयोग के लिए एक विधानसभा में सभी कामकाज सामान लिपटे। अगर किसी के पास यहां कोई सुझाव है, तो उनकी सराहना होगी

मैं न तो psexec और न ही कार्य योजनाकार का सुझाव नहीं दूंगा। लेकिन, क्या आपने सुडौविन को देखा है?

प्रक्रिया पूरी करने से पहले वह वही चाहता है जो आप चाहते हैं, अपवाद के साथ यह पासवर्ड के लिए पूछता है।

साथ ही, ओपन सोर्स और सभी होने के नाते, आप देख सकते हैं कि यह संबंधित सेवा समय से और फिर से प्रक्रियाओं को कैसे कार्यान्वित करता है।

कारण यह है कि कॉल पहली बार के बाद विफल हो सकती है क्योंकि यह "डिफ़ॉल्ट" सुरक्षा डिस्क्रिप्टर (जो भी है) का उपयोग करता है

एमएसडीएन से :

lpProcessAttributes [में, वैकल्पिक]

एक SECURITY_ATTRIBUTES संरचना के लिए एक संकेतक जो नई प्रक्रिया ऑब्जेक्ट के लिए एक सुरक्षा डिस्क्रिप्टर निर्दिष्ट करता है और यह निर्धारित करता है कि क्या बाल प्रक्रिया प्रक्रिया को वापस लाई जाती है। यदि lpProcessAttributes NULL है या lpSecurityDescriptor NULL है, तो प्रक्रिया को एक डिफ़ॉल्ट सुरक्षा डिस्क्रिप्टर मिलता है और संभाल विरासत में नहीं किया जा सकता है। डिफ़ॉल्ट सुरक्षा डिस्क्रिप्टर वह उपयोगकर्ता है जो hToken पैरामीटर में संदर्भित है। यह सुरक्षा डिस्क्रिप्टर कॉलर के लिए ऐक्सेस की अनुमति नहीं दे सकता है, उस स्थिति में प्रक्रिया चलने के बाद फिर से खोली नहीं जा सकती। प्रक्रिया संभाल मान्य है और पूर्ण पहुंच अधिकार जारी रहेगा।

मुझे लगता है कि CreateProcessWithLogonW इस डिफ़ॉल्ट सुरक्षा डिस्क्रिप्टर (किसी भी मामले में, मैं एक निर्दिष्ट नहीं कर रहा हूँ) बना रहा है

रोका जा रहा शुरू करने का समय …

बस एक अनुमान है – क्या आप आरंभ जानकारी के साथ LoadUserProfile = true का प्रयोग कर रहे हैं? CreateProcessWithLogonW डिफ़ॉल्ट रूप से उपयोगकर्ता रजिस्ट्री हाइव लोड नहीं करता है, जब तक कि आप इसे नहीं बताते हैं

CreateProcessWithLogonW का उपयोग करने के लिए आपको एक विंडो हैंडल की ज़रूरत नहीं है, मुझे पता नहीं है कि आपकी जानकारी कहां से मिली है

त्रुटि को प्रारंभ करने में विफल करने के लिए आवेदन कई कारण हैं, लेकिन यह लगभग हमेशा सुरक्षा या थका हुआ उपयोगकर्ता संसाधनों से संबंधित होता है। आप जो चल रहे हैं और आपके द्वारा चल रहे प्रसंग के बारे में बहुत अधिक जानकारी के बिना इसे निदान करना बेहद मुश्किल है। परन्तु इस बात की जांच करने वाली चीजें हैं: उपयोगकर्ता द्वारा निष्पादन योग्य फ़ाइल की निर्देशिका तक पहुंचने के लिए सही अनुमति है उपयोगकर्ता को खिड़की स्टेशन और डेस्कटॉप का उपयोग करने की अनुमति है जिसमें इसे लॉन्च किया जा रहा है, क्या इसकी किसी भी डीएलएल फाइलों पर सही अनुमति है, जिन्हें इनिशियलाइज़ेशन आदि में लोड की जरूरत है।

मैंने बस एमएसडीएन ( http://msdn.microsoft.com/en-us/library/ms682431(VS.85).aspx पर इस टिप्पणी को पढ़ा है):

इस फ़ंक्शन के साथ उपयोगकर्ता एप्लिकेशन को कॉल न करें! क्रिश्चियन विममर |
संपादित करें | इतिहास दिखाएं कृपया प्रतीक्षा करें यदि आप उपयोगकर्ता मोड अनुप्रयोगों को कॉल करने जा रहे हैं जो दस्तावेज संपादन और समान सामान (जैसे Word) प्रदान करते हैं, तो सभी न सहेजे गए डेटा खो जाएंगे। इसका कारण यह है कि सामान्य बंद करने का क्रम CreateProcessWithLogonW के साथ लॉन्च की जाने वाली प्रक्रियाओं पर लागू नहीं होता है। इस तरह से लॉन्च किये गए एप्लिकेशन WM_QUERYENDSION, WM_END सत्र और सबसे महत्वपूर्ण WM_QUIT संदेश प्राप्त नहीं करते हैं। इसलिए वे डेटा को बचाने या उनके सामान को साफ करने के लिए नहीं पूछते हैं। वे सिर्फ चेतावनी के बिना छोड़ देंगे यह फ़ंक्शन उपयोगकर्ता के अनुकूल नहीं है और सावधानी के साथ उपयोग किया जाना चाहिए।

यह सिर्फ "खराब उपयोगकर्ता अनुभव" है किसी को उम्मीद नहीं है

यह समझा सकता है कि मैंने क्या देखा है: पहली बार काम करता है बाद के हर समय विफल रहता है यह मेरी धारणा को मजबूत करता है कि कुछ आंतरिक रूप से ठीक से साफ नहीं किया जा रहा है

आप कहते हैं कि "विंडोज सर्विस" का प्रयोग शुरू कर दिया है "व्यवस्थापक" क्रेडेंशियल्स "

क्या आप वास्तविक प्रशासक खाते या 'व्यवस्थापक' समूह में एक उपयोगकर्ता का मतलब है? सेवा शुरू करने के बाद प्रशासक ने मेरे लिए यह हल किया

मेरे पास ऐसे ही समस्याएं थीं, जब मैंने फ़ान्टमजेएस-बाइनरी को "रनस" -विब के साथ विंडोज़ सेवा में शुरू करने की कोशिश की मैंने अब निम्न प्रक्रिया का उपयोग करते हुए समस्या का समाधान किया है:

  • उपयोगकर्ता के लिए प्रतिरूपण
  • प्रारंभ प्रक्रिया (UI बिना)
  • वापस प्रतिरूपण करें

आप प्रतिरूपण के लिए प्रतिरूपकर्ते-कक्षा का उपयोग कर सकते हैं यह निम्न गुणों को प्रोसेस्टस्टाईट इन्फोस में सेट करना भी महत्वपूर्ण है, इसलिए एप्लिकेशन विंडोज़ यूआई तक पहुंचने की कोशिश नहीं करता है:

 var processStartInfo = new ProcessStartInfo() { FileName = $@"{assemblyFolder}\PhantomJS\phantomjs.exe", Arguments = $"--webdriver={port}", RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, UseShellExecute = false, CreateNoWindow = true, ErrorDialog = false, WindowStyle = ProcessWindowStyle.Hidden };