- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 PInvoke 从 Powershell 使用 GetFileSecurity。调用本身有效,但 System.Runtime.InteropServices.Marshal.GetLastWin32Error 和 GetLastError (我导入用于测试)都返回错误的错误代码。看来 PInvoke 签名中的 SetLastError = true
根本没有任何效果,因为在启动新的 Powershell 实例后第一次运行脚本时,两者都返回 203 (ERROR_ENVVAR_NOT_FOUND),但是如果我再次调用同一个脚本,都返回 0。
作为快速测试,我编写了一个等效的 C 程序,并且 GetLastError 返回了预期值 (122 == ERROR_INSUFFICIENT_BUFFER)。
请注意,我对 Powershell 和 .NET 总体来说还是个新手,所以请原谅任何明显的失礼。
$signature = @'
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetFileSecurity(
string lpFileName,
int RequestedInformation,
byte [] pSecurityDescriptor,
uint nLength,
out int lpnLengthNeeded
);
[DllImport("Kernel32.dll")]
public static extern uint GetLastError();
'@
$enum = @'
namespace Win32 {
public enum SECURITY_INFORMATION : uint
{
OWNER_SECURITY_INFORMATION = 0x00000001,
GROUP_SECURITY_INFORMATION = 0x00000002,
DACL_SECURITY_INFORMATION = 0x00000004,
SACL_SECURITY_INFORMATION = 0x00000008,
UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000,
PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000
}
}
'@
Add-Type -TypeDefinition $enum
Add-Type -MemberDefinition $signature -Name API -Namespace Win32
$len = 0
$sec = New-Object byte[] 0
$info = new-object Win32.SECURITY_INFORMATION
$info = [Win32.SECURITY_INFORMATION]::OWNER_SECURITY_INFORMATION -bor
[Win32.SECURITY_INFORMATION]::GROUP_SECURITY_INFORMATION -bor
[Win32.SECURITY_INFORMATION]::DACL_SECURITY_INFORMATION
[Win32.API]::GetFileSecurity("c:\temp", $info, $sec, $sec.Length, [ref] $len)
[System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
[Win32.API]::GetLastError()
最佳答案
我会创建一个包装器 C# 类来进行 GetFileSecurity 调用,然后获取错误,而不是直接 pinvoking。 PowerShell 在 GetFileSecurity() pinvoke 调用和 GetLastWin32Error() pinvoke 调用之间对 Win32 API 进行的任何调用都可能会重置 Win32 错误号。
关于.net - Powershell、PInvoke 和 GetLastError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18213687/
处理 Application_Error 中的错误时,我应该使用这两个中的哪一个? 我正在为两者找到多个示例,但不清楚一个是否比另一个更好。是否存在只有一个会显示正确错误的情况? 另外,我怀疑这很重要
不久前,我为 Windows API 函数编写了一个简单的包装器类。我编写了一组单元测试来验证该类生成的结果与直接调用 API 相匹配。 最近我回去添加了关于跨不同线程使用包装器类的单元测试。我发现
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我有一个函数,它为每种情况返回不同的 DWORD 值,如果出现错误。所以我有以下定义: #define ERR_NO_DB_CONNECTION 0x90000 #define ERR_DB_N
德尔福 Xe。 在delphi帮助中:“...调用此函数通常会重置操作系统错误状态...” 如何将当前错误重置为 0? IE。 GetLastError=0 示例: Try // There is a
在调用像 ExtractShortPathName 这样的 Windows API 函数包装器后使用 GetLastError 时,我注意到 GetLastError 返回一个非零错误代码,无论是否对
我正在尝试编写一些函数来创建仅用于使用剪贴板的 Windows 消息窗口。我知道创建窗口失败,但是当我添加 GetLastError() 函数调用时,该函数永远不会返回到 Java。这使得调试变得很棘
这非常类似于: Turning GetLastError() into an exception 我还希望能够将 std::string 添加到错误中: class Win32Exception
下面是一个创建线程的简单程序。我希望我遗漏了一些明显的东西。仅供引用 - 我是 Win32 的新手。 为什么线程执行中的GetLastError()返回87(ERROR_INVALID_PARAMET
我有一个函数可以将 GetLastError 函数转换为字符串以在我的项目中使用。但在部署之前,我需要在示例程序中进行测试。当我测试它时,它没有给我任何错误,因为示例程序没有任何错误。 谁能帮我如何在
在此示例中,dwerror 是 10045L。但此代码返回 0x13d 值作为错误。如何获取格式消息?请看一下。 TCHAR lpMsgBuf[512]; if(!FormatMessage(
我有一个可以打开很多窗口的应用程序。有时,我得到 wglCreateContext() 返回 0 而 GetLastError() 返回 0xc007001f。 它只发生在 Intel 显卡上。 有人
我知道 GetLastError 会在发生错误时立即调用。我写了函数: void PrintErrorMsg() { DWORD errCode = GetLastError(); L
为什么 QT 应用程序中的最后一个错误始终为零? SetLastError(23); qDebug() << "LastError: " << GetLastError(); 预期输出:最后一个错误:
假设我正在使用 APC,其中过程和调用代码都使用 SetLastError 和 GetLastError。这会导致 GetLastError 产生不可预测的值。有什么办法可以解决这个问题吗? VOID
我有一个 Visual Studio 2008 C++ 项目,它在出现异常 错误时使用 Win32Exception 类。 Win32Exception 类如下所示: /// defines an e
假设 GetLastError(和变体)是每线程还是每进程是否正确?如果它是每个进程的问题在多线程应用程序中有些明显,因为无法保证在失败的调用和 GetLastError 之间没有进行其他 Win32
为什么是RegCreateKeyEx()返回 LONG ,而不是设置 DWORD错误代码来自 SetLastError() ? 转换它的 LONG 对我来说安全吗?将值返回给 DWORD然后用 Set
我如何在 php 中使用 getLastError() 检查我的保存方法是否正在插入到 mongo? 我按如下方式设置我的数据库: $this->databaseEngine = $app['mong
如果您有一个大型系统,它会自动显示一个漂亮的窗口来解释捕获的异常,那么能够将错误代码与消息一起显示(以供进一步调查)会很好。但是由于某些函数调用是针对设置错误代码的失败 Windows 函数,而有些是
我是一名优秀的程序员,十分优秀!