Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#调用Kernel32.dll函数时,是否可能获取最后一个错误代码?_C#_Dllimport_Error Code_Kernel32_System Error - Fatal编程技术网

从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对我给你的建议比这个问题的细节更广泛。不客气。