gpt4 book ai didi

c# - wmi 无效查询错误

转载 作者:行者123 更新时间:2023-11-30 22:29:02 24 4
gpt4 key购买 nike

我正在尝试获取 c:\windows\ntds\目录中存在的此 dsa 文件的大小。

我这里出错了,我不知道为什么。错误是“无效查询”。

当我使用不同的 WMI 类时,我似乎经常遇到这个错误。

我不知道为什么会出现这个错误,如何解决?

下面的代码有没有错误,如何解决?

为什么我们会得到这个 Invalid Query 错误,它的来源是什么?它的内部异常将始终为 null?

private int getDatabaseFileSize(string DSADatabaseFile, string machineName)
{
string scope = @"\\" + machineName + @"\root\CIMV2";
string query = string.Format("Select FileSize from CIM_DataFile WHERE Name = '{0}'", DSADatabaseFile);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementObject mobj in searcher.Get())
{
Console.WriteLine("File Size : " + mobj["FileSize"]);
}
return 0;
}

谢谢

最佳答案

我在猜测,但由于您的查询在语法上是正确的并且使用了正确的字段和对象名称,我认为这是因为您将字符串“C:\Windows\NTDS\ntds.dit”作为 DSADatabaseFile 传递。这对于 C# 中的“典型”使用是正确的,例如使用 Path 类等,但此处不是。

您需要将带有两个反斜杠的文件名传递给 WMI。然而,由于 C# 已经要求,您需要有效地传递四个:

 getDatabaseFileSize("C:\\\\Windows\\\\NTDS\\\\ntds.dit", machine)

或使用逐字字符串文字:

 getDatabaseFileSize(@"C:\\Windows\\NTDS\\ntds.dit", machine);

更新这是一个完整的例子:

// Compile with: csc foo.cs /r:System.Management.dll

using System;
using System.Management;

namespace Foo
{
public class Program
{
private int getDatabaseFileSize(string DSADatabaseFile, string machineName)
{
string scope = @"\\" + machineName + @"\root\CIMV2";
string query = string.Format("Select FileSize from CIM_DataFile WHERE Name = '{0}'", DSADatabaseFile);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementObject mobj in searcher.Get())
{
Console.WriteLine("File Size : " + mobj["FileSize"]);
}
return 0;
}

public static void Main(string[] args)
{
var p = new Program();

// These work
p.getDatabaseFileSize("C:/boot.ini", ".");
p.getDatabaseFileSize(@"C:\\boot.ini", ".");
p.getDatabaseFileSize("C:\\\\boot.ini", ".");

// These fail
try {
p.getDatabaseFileSize("C:\\boot.ini", ".");
} catch (ManagementException ex) {
Console.WriteLine("Failed: {0}", ex.ErrorCode);
}
try {
p.getDatabaseFileSize(@"C:\boot.ini", ".");
} catch (ManagementException ex) {
Console.WriteLine("Failed: {0}", ex.ErrorCode);
}
}
}
}

编译:

(预期的)输出是:

File Size : 313
File Size : 313
Failed: InvalidQuery.
Failed: InvalidQuery.

更新 好像有个related已经有问题了(提到需要 \\\\ 而不是 \\)。

关于c# - wmi 无效查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10408220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com