Tag: winapi

从Windows服务的特定凭据启动进程

我已经花了几天时间来解决这个问题,尽管网上有很多不同的例子,这是一个棘手的问题,我不能让他们在我的场景中工作。 我有一个在本地系统帐户下运行的Windows服务。 它有一个WCF端点侦听API请求。 当通过API告知时,该服务应该在系统会话(0)和“工作者”帐户凭证中启动新进程。 该进程是一个检查队列中的工作并执行此操作的工作程序。 如果找不到工作,它会睡一会儿并再次检查。 如果确实找到了工作,它会在同一会话中启动一个新进程并使用相同的凭据并完成工作。 完成工作后关闭。 “Worker”是域帐户,是计算机上本地管理员组的成员,对可执行文件具有执行权限。 该计算机与该帐户位于同一域中。 问题是,当服务尝试启动进程时,它会从CreateProcessAsUser方法获取ERROR_ACCESS_DENIED (5)错误代码。 我尝试在具有相同凭据的Windows 7计算机上运行相同的代码并且工作正常,但在Windows Server 2008上运行时会获得该错误代码。 代码太大了,不能在这里显示,所以我把它放在其他地方…… ProcessHelper : http : //pastie.org/private/y7idu3nw4xv1fxzeizbn9g 该服务调用StartAsUserFromService方法来启动进程,该进程在建立会话后在内部调用CreateProcessAsUser 。 该进程调用StartAsUserFromApplication方法来启动其后继,后者在内部调用CreateProcessWithLogonW 。 ImpersonationContext : http : //pastie.org/private/xppc7wnoidajmpq8h8sg 该服务需要获取用户令牌以启动进程。 该过程不需要启动其后继者。 据我所知,模拟在Server 2008上是成功的,但它没有一些权限,我无法弄清楚哪个。 编辑: 我在Windows 7计算机上尝试了本地管理员帐户和域帐户,它们运行正常。 但它们都不能在Server 2008机器上运行。 某处必须有遗失许可,但我不知道在哪里; 错误消息没有帮助。 我还尝试在可执行文件的兼容性选项卡中勾选“以管理员身份运行”框,但它没有任何区别。 编辑: 我使用进程监视器来查看服务中发生了什么,这是它收到错误的地方…… Date & Time: 12/02/2014 11:44:03 Event Class: File System Operation: […]

使用代码模拟窗口拖放?

我想我过去可能会问过类似的问题,但我仍然被卡住了…… 作为自动化流程的一部分,我必须将特定的媒体文件子集“导入”一个封闭源的第三方应用程序(Dartfish,这很重要)。 情况如下: 媒体(video)文件都在一个文件夹中(其中有1000个,不幸的是重组不是一个选项)。 在我编写的脚本的任何给定迭代中,只有13个特定文件必须导入到应用程序中。 应用程序中没有必须接收文件的导入function。 这个相同的应用程序允许您将文件拖放到特定窗格中,这使您可以实际导入它们。 我正在使用的当前解决方法非常不稳定和丑陋,并使用复杂的正则表达式查询过程来隔离Xplorer2中的文件,然后使用AutoIT选择它们,然后最终将它们拖到应用程序中。 建议的解决方案: 我需要一种方法将任何给定时间所需的video文件的特定子集拖放到此应用程序中,最好不要自动执行点击和光标移动(此设置中存在太多故障点)。 我本质上只是将一个文件名列表传递给应用程序(通过拖动它们),所以我认为必须有一种方法可以自动执行这种拖放操作纯粹在代码中 – 可能使用C / C#/ C ++和windows API ? 如果解决方案可以某种方式移植到Python,则可以获得奖励……但不是必需的。 如果有人能指出我正确的方向(编程语言并不重要;我会学到任何我需要知道的东西),最好给我一个基本的大纲或如何完成这样一个任务的例子,我会真的很感激! 这已经让我疯了一年多了!

在Windows登录屏幕中运行表单C#

我需要编写一个小工具,在每个userdesktop上运行,如果没有人登录,则直接在登录屏幕上运行。 也许一个表单开始的服务? 我已经找到了这个问题(和答案): 在Windows 7欢迎屏幕上运行一个进程 // grab the winlogon process Process winLogon = null; foreach (Process p in Process.GetProcesses()) { if (p.ProcessName.Contains(“winlogon”)) { winLogon = p; break; } } // grab the winlogon’s token IntPtr userToken = IntPtr.Zero; if (!OpenProcessToken(winLogon.Handle, TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE, out userToken)) { log(“ERROR: OpenProcessToken returned false – ” + […]

如何知道键盘在文本输入上是否处于活动状态

我有一个像屏幕键盘一样的应用程序,我需要它知道键盘光标(插入符号)是否在任何位置处于活动状态,因此键盘将设置为活动状态。 我搜索了键盘钩子和winapi,但我找不到合适的方法。 为了简化我的问题,如果用户可以按真实键盘并在计算机上打印文本,我需要激活我的应用程序。

将Click Message发送到另一个应用程序进程

我有一个场景,我需要将点击事件发送到一个独立的应用程序。 我使用以下代码启动了该应用程序。 private Process app; app = new Process(); app.StartInfo.FileName = app_path; app.StartInfo.WorkingDirectory = dir_path; app.Start(); 现在我想将鼠标点击消息发送到该应用程序,我有相对于应用程序窗口的特定坐标。 我如何使用Windows Messaging或任何其他技术来完成。 我用了 [DllImport(“user32.dll”)] private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo); 它运行良好但导致指针移动。 所以不适合我的需要。 然后我用。 [DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = false)] static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int […]

在派生的C#用户控件中处理Windows通知

如何处理从.NET TreeView控件派生的C#类中列出的任何树视图通知? 我试图处理点击通知,例如,像这样: class ExtendedTreeView : TreeView { private const Int32 NM_FIRST = (Int32)(0U – 0U); private const Int32 NM_CLICK = unchecked((Int32)((UInt32)NM_FIRST – 2U)); protected override void WndProc(ref Message m) { if (m.Msg == NM_CLICK) { MessageBox.Show(“NM_CLICK”); } base.WndProc(ref m); } } 但永远不会显示消息框。 这是我第一次尝试使用Win32 API来修改.NET控件的行为,所以我不知道出了什么问题。 这是处理这些通知的正确方法吗? 仅供参考:我知道.NET TreeView控件有一个click事件。 这只是第一次测试。 后来我想启用TVS_EX_MULTISELECT样式。 由于.NET TreeView控件在启用AfterSelect时不会触发任何AfterSelect事件,因此我想稍后调查TVN_SELCHANGED和TVN_ITEMCHANGED通知的行为。

如何使用C#查找所有窗口?

有Win32函数可以在系统上查找窗口: [DllImport(“user32.dll”, SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport(“user32.dll”, EntryPoint = “FindWindow”, SetLastError = true)] public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 但是如何在系统上找到所有窗口句柄?

没有调用WH_KEYBOARD_LL挂钩

我在使用WH_KEYBOARD_LL钩子时遇到了一些问题: 我使用全局LL钩子的原因并不重要我只需要它为我的应用程序(我尝试了其他类型的钩子,但它们对我不起作用)。 钩子函数在一个dll中,dll在应用程序启动时加载,钩子也在主线程启动时设置。 这非常有效。 当我需要停用挂钩并重新激活它时,会出现问题。 如果我从应用程序的主线程执行此操作它可以正常工作,但我需要的是从计时器执行此操作,这里出了问题。 我使用计时器来检查我的应用程序的窗口是否是前台窗口(活动窗口),如果是,则挂钩被激活,如果不是,则挂钩被停用。 从计时器调用时SetWindowsHookEx的返回值总是ok(非null),根据MSDN,这意味着钩子已成功设置,但我的钩子函数永远不会被调用。 以下是我设置钩子的方法: SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0); 有没有人经历过这个? 我唯一的猜测是我的钩子函数在一个DLL中,而计时器回调来自另一个dll,这与我的问题有什么关系吗?

在C#中使用SHAssocEnumHandlers

我正在努力在C#中调用WinAPI SHAssocEnumHandlers。 using System; using System.Runtime.InteropServices; namespace AssocHandlerTest { [Flags] public enum ASSOC_FILTER { ASSOC_FILTER_NONE = 0x0, ASSOC_FILTER_RECOMMENDED = 0x1 }; [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid(“F04061AC-1659-4a3f-A954-775AA57FC083”)] public interface IAssocHandler { int GetName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz); int GetUIName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz); int GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszPath, [Out] out int pIndex); int IsRecommended(); int MakeDefault([In, MarshalAs(UnmanagedType.LPWStr)] […]

使用派生的DateTimePicker类显示自定义日历下拉列表

我的目标是在.NET 2.0中创建一个自定义DateTimePicker类,它显示自定义日历下拉列表而不是Windows默认日历弹出窗口。 通过观察Windows消息(参见附件代码),我可以在创建后找到并隐藏/关闭日历窗口。 但是,问题仍然存在:关闭日历窗口后,某些内容仍然阻止鼠标输入。 例如,如果在以编程方式关闭日历下拉列表(附加代码)后尝试最大化自定义DateTimePicker控件的所有者表单,则“最大化”按钮不会响应。 只有下一次点击才有效。 有趣的是,“非function性点击”会触发DTN_CLOSEUP通知,因此WM_CLOSE似乎没有正确关闭日历。 关于如何完成我的任务的任何提示都非常感谢:) protected override void WndProc(ref System.Windows.Forms.Message m) { if (m.Msg == (int)SYSMSG.WM_REFLECT + (int)SYSMSG.WM_NOTIFY) { NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR)); switch (nmhdr.code) { case DTN_DROPDOWN: // Hide window IntPtr calHandle = FindWindow(“SysMonthCal32”, null); SendMessage(calHandle, (int)SYSMSG.WM_SIZE, 0, SP.Convert.MakeLong(0, 0)); this.BeginInvoke((MethodInvoker)delegate() { SendMessage(calHandle, (int)SYSMSG.WM_CLOSE, 0, 0); }); break; } } base.WndProc(ref […]