Tag: winapi

确定用户是否在本地管理员组中

我的问题 我正在使用PInvoked Windows API函数来validation用户是否属于本地管理员组。 我正在使用GetCurrentProcess , OpenProcessToken , GetTokenInformation和LookupAccountSid来validation用户是否是本地管理员。 GetTokenInformation返回一个TOKEN_GROUPS结构数组的SID_AND_ATTRIBUTES结构。 我遍历集合并比较LookupAccountSid返回的用户名。 我的问题是,在本地(或更普遍地在我们的内部域),这可以按预期工作。 内置\ Administrators位于当前进程令牌的组成员身份中,我的方法返回true。 在另一个开发人员的另一个域上,该函数返回false。 LookupAccountSid在TOKEN_GROUPS结构的前2次迭代中正常运行,返回None和Everyone,然后TOKEN_GROUPS地抱怨“A参数不正确”。 什么会导致只有两组正常工作? TOKEN_GROUPS结构表示有14个组。 我假设它是无效的SID。 我所拥有的一切都是PInvoke 网站上的一个例子。 唯一的区别是,使用LookupAccountSid我已将Sid参数从byte[]更改为IntPtr因为SID_AND_ATTRIBUTES也是使用IntPtr定义的。 这是正确的,因为LookupAccountSid是用PSID定义的吗? LookupAccountSid PInvoke [DllImport(“advapi32.dll”, CharSet = CharSet.Auto, SetLastError = true)] static extern bool LookupAccountSid( string lpSystemName, IntPtr Sid, StringBuilder lpName, ref uint cchName, StringBuilder ReferencedDomainName, ref uint cchReferencedDomainName, out SID_NAME_USE peUse); 代码落空的地方 for […]

访问冲突读取位置0x0000000c

在我的应用程序中,我使用’LowLevelKeyboardProc’禁用了开始菜单。 但是当我连续按Tab键时出现以下错误。 错误.. Timer_soosai.exe中0x00352d58处的未处理exception:0xC0000005:访问冲突读取位置0x0000000c。 00352D58 mov eax,dword ptr [ecx+0Ch] /*This is the line which 导致错误排除。* / 代码: [DllImport(“user32”, EntryPoint = “SetWindowsHookExA”, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId); [DllImport(“user32”, EntryPoint = “UnhookWindowsHookEx”, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] […]

EnumResourceNames问题 – 未知错误

我最近使用二级库/二进制模块的资源,遇到了一个奇怪的错误。 我有两个本机WinAPI引用: [DllImport(“kernel32.dll”, SetLastError = true)] public extern static bool EnumResourceNames(IntPtr hModule, int lpszType, EnumResNameProc lpEnumFunc, IntPtr lParam); [DllImport(“kernel32.dll”, SetLastError=true)] public extern static IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags); 当我调用LoadLibraryEx时,我正在获取IntPtr实例 – 正是我需要的: IntPtr x = WinApi.LoadLibraryEx(@”D:\Software\Reflector\Reflector.exe”,IntPtr.Zero,2); Debug.WriteLine(x.ToInt32()); 但是,当我尝试枚举图标资源(由ID = 3定义)时: Debug.WriteLine(WinApi.EnumResourceNames(x, 3, new EnumResNameProc(ListCallback), IntPtr.Zero)); Debug.WriteLine(Marshal.GetLastWin32Error()); 我收到此错误代码(由GetLastError返回): -532462766 这通常意味着存在未知错误,据我所知,但我只是好奇 – 从可执行文件列出资源可能会出现什么问题?

在WPF上缺少WM_Messages

我通过单击Windows任务栏来最小化/恢复我的wpf应用程序时遇到问题。 有时它有效,有时则不然。 所以, 我在app主窗口添加了一个钩子 ,试图看看事件是否来了。 有时他们这样做,有时他们没有。 然后我使用Spy ++来查看事件是否至少被启动……是的! 他们是。 那我为什么只收到其中一些? public MyMainWindow() { InitializeComponent(); this.SourceInitialized += new EventHandler(OnSourceInitialized); } void OnSourceInitialized(object sender, EventArgs e) { HwndSource source = (HwndSource)PresentationSource.FromVisual(this); source.AddHook(new HwndSourceHook(HandleMessages)); } private IntPtr HandleMessages(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x0112://WM_SYSCOMMAND: switch ((int)wParam & 0xFFF0) […]

使用CreateProcessAsUser和CreateEnvironmentBlock创建进程后,不会设置Clientname

我编写了一个在本地系统帐户下运行的C#服务。 当用户登录到Terminalserver时,我用它来生成进程。 该服务实现OnSessionChange方法,并使用相应的SessionID接收SessionChangeDescription消息。 我使用此SessionID通过WTSQueryUserToken从用户获取访问令牌。 我将此标记转换为主标记并将其传递给CreateEnvironmentBlock以检索指向用户环境变量的指针。 经过一些进一步的准备工作后,我调用CreateProcessAsUser函数最终将我的进程作为最近登录的用户在winsta0\default桌面上生成。 当我使用ProcessExplorer调查该过程时,我发现进程上下文中没有CLIENTNAME环境变量。 然而,应用程序需要这个变量。 我不知道我做错了什么。 或许我错过了一些东西。 应该加载用户配置文件,因为我在用户登录时做出反应。 是否可能存在一些时间问题? 或者CLIENTNAME var是否以任何其他方式应用于进程? 以下是我调用CreateEnvironmentBlock函数的方法: private static IntPtr GetEnvironmentFromToken(IntPtr token) { // Get a pointer to the environment variables from the specified user access token IntPtr newEnvironment = IntPtr.Zero; if (!WinApi.CreateEnvironmentBlock(ref newEnvironment, token, false)) { newEnvironment = IntPtr.Zero; } return newEnvironment; } 如果您需要更多信息或代码示例,请随时提出。

调试使用Vista API中的FileDialog的Visual Studio 2010解决方案时出现问题

我有一个WinForms C#Visual Studio 2008(.NET 3.5)解决方案,将升级到Visual Studio 2010(.NET保持在3.5版本)。 此解决方案使用Vista API中的FileDialog有两个原因: 在Windows XP中运行应用程序时,期望为用户提供Windows XP外观文件对话框。 在Windows Vista和7中运行相同的应用程序时,文件对话框将具有Vista外观。 更重要的是,我们的应用程序允许用户打开项目文件,该文件可以是本地文件(存储在用户的计算机上或USB设备上),也可以是服务器项目(托管在MS SQL Server中)。 为此,我们使用Vista API,因为我们可以访问文件类型下拉列表控件的事件处理程序。 因此,实现是这样的,向用户呈现打开文件对话框,当他们从文件类型下拉列表中选择“服务器”选项时,打开文件对话框关闭,并打开另一个对话框,允许用户选择他们希望连接的服务器和服务器项目。 在Visual Studio 2008中调试应用程序时,Vista API没有问题。 当解决方案升级到Visual Studio 2010(在Windows 7中运行)时,用户尝试调试应用程序,并且用户希望访问Vista API打开文件对话框,应用程序崩溃并抛出ArgumentException,并显示以下消息: “价值不在预期范围内”。 当用户在没有调试(Ctrl + F5)的情况下从Visual Studio 2010运行解决方案时,没有exception发生。 “违规”代码是: internal void DoFolderChange(IFileDialog dialog) { IShellItem ppsi = null; string ppszName = string.Empty; dialog.GetFolder(out ppsi); // Exception occurs here […]

打开另一个应用程序的系统菜单

我有一个像我正在开发的应用程序的WPF TaskBar,我希望能够打开我右键单击的应用程序的系统菜单(在我的自定义任务栏中),保留应用程序可能创建的任何自定义菜单(即谷歌Chrome)。 我有以下代码,适用于我之前制作的无边框窗口应用程序,但它似乎不起作用,我想知道为什么? 我需要做些什么才能让它发挥作用? public static void ShowContextMenu(IntPtr hWnd) { SetForegroundWindow(hWnd); IntPtr wMenu = GetSystemMenu(hWnd, false); // Display the menu uint command = TrackPopupMenuEx(wMenu, TPM.LEFTBUTTON | TPM.RETURNCMD, 0, 0, hWnd, IntPtr.Zero); if (command == 0) return; PostMessage(hWnd, WM.SYSCOMMAND, new IntPtr(command), IntPtr.Zero); } 提示:TrackPopupMenuEx(…)似乎立即返回值0,而不是等待响应…

记录Windows中已关闭的所有Windows

我想在.NET中创建一个shell扩展或应用程序,记录所有关闭的窗口。 日志应包含创建窗口的进程名称。 我对如何做到这一点没有任何想法。 有什么指针吗?

使用p / invoke和win-api监听音频线路输入(C#)

在过去的几天里,我试图用win-api(winmm.dll)编写一个小程序来监听音频线路输入。 我可以调用诸如waveInOpen之类的api函数,但我无法弄清楚如何使用这些函数来实现我的目标。 问题是 – 有人可以简单告诉我如何使用这些API(C#)从音频线获取数据。

在C#中,我有一个到WIN32 WndProc的IntPtr。 调用它的语法是什么?

我是子类化本机窗口(combobox的编辑控件……) oldWndProc = SetWindowLong(HandleOfCbEditControl,GWL_WNDPROC,newWndProc); 在我的子类wndproc中,我会有这样的代码,对,但我无法弄清楚调用oldWndProc的语法。 int MyWndProc(int Msg, int wParam, int lParam) { if (Msg.m == something I’m interested in…) { return something special } else { return result of call to oldWndProc <<<< What does this look like?*** } } 编辑:此问题中的“子类化”一词是指WIN32 API的含义,而不是C#。 这里的子类化并不意味着重写.NET基类行为。 这意味着告诉WIN32调用你的函数指针而不是windows当前回调。 它与C#中的inheritance无关。