从C#调用Kernel32.dll函数时,是否可能获取最后一个错误代码?
我有两个来自从C#调用Kernel32.dll函数时,是否可能获取最后一个错误代码?,c#,dllimport,error-code,kernel32,system-error,C#,Dllimport,Error Code,Kernel32,System Error,我有两个来自Kernel32.dll的函数,我正在从C#程序调用这些函数。我导入的函数如下所示: [System.Runtime.InteropServices.DllImport("Kernel32.dll", EntryPoint = "GetSystemTime", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)] private static
Kernel32.dll的函数,我正在从C#
程序调用这些函数。我导入的函数如下所示:
[System.Runtime.InteropServices.DllImport("Kernel32.dll", EntryPoint = "GetSystemTime", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
private static extern void GetSystemTime(ref SYSTEMTIME lpSystemTime);
[System.Runtime.InteropServices.DllImport("Kernel32.dll", EntryPoint = "SetSystemTime", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
private static extern UInt32 SetSystemTime(ref SYSTEMTIME lpSystemTime);
其中,SYSTEMTIME
是这些方法接受的结构
SetSystemTime
的文档说明,如果函数失败,它将返回0,并调用GetLastError
以获取关于失败的扩展信息。因此,我以与上述函数相同的方式从Kernel32.dll
文件导入了GetLastError
。现在,当我将故障模拟为:
if (SetSystemTime(ref st) == 0) {
Console.WriteLine(GetLastError() + " Error occurred: SetSystemTime returned zero.");
}
GetLastError()
打印1314
的代码,该代码用于客户端未持有的所需特权。我更改了本地安全策略
,将用户添加到用户权限分配中的替换进程级令牌
,但我仍然得到相同的代码。我所做的是正确的还是遗漏了什么?这看起来像是UAC造成的“用户权限分配”
试试这个:
1] 使用本地安全策略
有时它是由于一些管理员帐户冲突而发生的。在这种情况下,您需要打开本地安全策略窗口。您可以在任务栏搜索框或Cortana中搜索相同的内容,也可以按Win+R
,键入secpol.msc
,然后点击回车按钮
导航到本地策略>安全选项
。定位用户帐户控制:以管理员批准模式运行所有管理员
,并将其设置为禁用
- 或
2] 禁用UAC
UAC或用户帐户控制阻止程序在系统中进行任何更改。然而,有时它也会产生问题。因此,您可以暂时尝试禁用UAC并检查其是否工作。要在Windows中禁用用户帐户控制,请在任务栏搜索框中搜索用户帐户控制设置。您应该将UAC设置为“从不通知”
我希望它能帮助您。不要导入GetLastError
,直接调用它。您必须在p/invoke声明中使用SetLastError=true
,然后使用Marshal.GetLastWin32Error()
。这允许p/invoke框架在函数调用返回后立即捕获错误代码。否则.net framework可能会调用另一个API调用并修改线程的错误代码。很明显,调用SetSystemTime
需要调用方持有SE\u SYSTEMTIME\u NAME
特权,而函数在未持有特权时会帮助您获得特权,它仍然需要您的帐户才能获得它。这意味着以管理员身份运行(提升),或者通过本地安全策略明确分配“更改系统时间”权限。通常,在允许您的程序扰乱系统时钟之前,请三思。@DavidHeffernan的封送。GetLastWin32Error()
也会返回相同的1314
code@NavjotSingh对我给你的建议比这个问题的细节更广泛。不客气。