是否可以使用 SQLConfigDataSourceW 从 C# 创建 ODBC 系统 DSN?

Is it possible to create a ODBC System DSN from C# using SQLConfigDataSourceW?

我需要以编程方式从 C# 创建 ODBC DSN 连接。我已经使以下代码正常工作,它使用 SQLConfigDataSourceW 函数创建 ODBC DSN 连接。

   public class OdbcWrapper
{

    [DllImport("ODBCCP32.DLL", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern bool SQLConfigDataSourceW(UInt32 hwndParent, RequestFlags fRequest, string lpszDriver, string lpszAttributes);

    enum RequestFlags : int
    {
        ODBC_ADD_DSN = 1,
        ODBC_CONFIG_DSN = 2,
        ODBC_REMOVE_DSN = 3,
        ODBC_ADD_SYS_DSN = 4,
        ODBC_CONFIG_SYS_DSN = 5,
        ODBC_REMOVE_SYS_DSN = 6,
        ODBC_REMOVE_DEFAULT_DSN = 7
    }

    public bool UpdateDsnServer(string name, string server)
    {
        var flag = RequestFlags.ODBC_ADD_DSN;
        string dsnNameLine = "DSN=" + name;
        string serverLine = "Server=" + server;

        string trusted = "Trusted_Connection=YES";

        string configString = new[] { dsnNameLine, serverLine,trusted }.Aggregate("", (str, line) => str + line + "[=10=]");

        return SQLConfigDataSourceW(0, flag, "SQL Server", configString);
    }
}

我可以使用以下方式调用:

var odbc = new OdbcWrapper();
bool test = odbc.UpdateDsnServer("TEST_DSN_NAME", "TEST_SERVER_NAME");
MessageBox.Show(test.ToString());

这适用于创建用户 DSN 的 ODBC_ADD_DSN = 1 和 returns test = true,但是当我将标志更改为 ODBC_ADD_SYS_DSN = 4 时,它 returns test = false 并且没有创建系统 DSN,这两种情况都通过检查 ODBC 数据源管理器来确认。

运行 具有提升权限的应用程序允许创建系统 DSN。上面的代码按原样工作,但应用程序缺少在 ODBC 数据源管理器中请求的权限提升。一旦 运行 获得正确的权限,代码就会复制创建、删除和配置用户、文件和系统 DSN 的功能。