BExplorer.Shell.Interop.CredUI.RunProcesssAsUser C# (CSharp) Method

RunProcesssAsUser() public static method

public static RunProcesssAsUser ( String processPath ) : void
processPath String
return void
		public static void RunProcesssAsUser(String processPath) {
			// Setup the flags and variables
			StringBuilder userPassword = new StringBuilder(), userID = new StringBuilder();
			var credUI = new CREDUI_INFO();
			credUI.pszCaptionText = "Please enter the credentails for " + new ShellItem(processPath).DisplayName;
			credUI.pszMessageText = "DisplayedMessage";
			credUI.cbSize = Marshal.SizeOf(credUI);
			uint authPackage = 0;
			var outCredBuffer = new IntPtr();
			uint outCredSize;
			bool save = false;
			int result = CredUIPromptForWindowsCredentials(
				ref credUI,
				0,
				ref authPackage,
				IntPtr.Zero,
				0,
				out outCredBuffer,
				out outCredSize,
				ref save,
				1 /* Generic */);

			var usernameBuf = new StringBuilder(100);
			var passwordBuf = new StringBuilder(100);
			var domainBuf = new StringBuilder(100);

			int maxUserName = 100;
			int maxDomain = 100;
			int maxPassword = 100;
			if (result == 0) {
				if (CredUnPackAuthenticationBuffer(0, outCredBuffer, outCredSize, usernameBuf, ref maxUserName, domainBuf, ref maxDomain, passwordBuf, ref maxPassword)) {
					//TO_DO: ms documentation says we should call this but i can't get it to work
					//SecureZeroMem(outCredBuffer, outCredSize);

					//clear the memory allocated by CredUIPromptForWindowsCredentials
					Ole32.CoTaskMemFree(outCredBuffer);

					var pass = new SecureString();
					foreach (char _char in passwordBuf.ToString().ToCharArray()) {
						pass.AppendChar(_char);
					}

					using (var p = new Process()) {
						p.StartInfo.UseShellExecute = true;
						p.StartInfo.WorkingDirectory = Path.GetDirectoryName(processPath);
						p.StartInfo.FileName = processPath;
						p.StartInfo.UserName = usernameBuf.ToString();
						p.StartInfo.Password = pass;
						p.StartInfo.Domain = domainBuf.ToString();
						p.StartInfo.UseShellExecute = false;
						p.Start();
					}
				}
			}
		}
	}