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

是否可以使用SQLConfigDataSourceW从C#创建ODBC系统DSN?,c#,odbc,dsn,C#,Odbc,Dsn,我需要以编程方式从C#创建ODBC DSN连接。我已经完成了以下代码,它使用SQLConfigDataSourceW函数创建ODBC DSN连接 public class OdbcWrapper { [DllImport("ODBCCP32.DLL", CharSet = CharSet.Unicode, SetLastError = true)] static extern bool SQLConfigDataSourceW(UInt32 hwndParent, Req

我需要以编程方式从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 + "\0");

        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并返回
test=true
ODBC\u ADD\u DSN=1
,但当我将标志更改为
ODBC\u ADD\u SYS\u DSN=4
时,它返回
test=false
且未创建系统DSN,这两种情况都可以通过检查ODBC数据源管理员来确认。

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

请参阅pinvole。我发现你的代码和pinvoke之间有两个区别1)枚举应该是int16 2)你需要在文件名周围加引号:如果你的应用程序可以创建用户DSN,但不能创建系统DSN,那么它可能没有足够的权限修改Windows注册表的该部分。检查应用程序运行的帐户。@GordThompson我同意这似乎是问题所在。我运行应用程序的帐户是管理员,当我检查HKEY\U LOCAL\U MACHINE\SOFTWARE\ODBC注册表时,用户可以完全控制ODBC和所有子项。我无法理解的另一点是,我可以使用相同的服务器和集成的Windows身份验证从ODBC数据源管理员创建一个新的系统DSN。如果此处的权限足够,为什么C#应用程序的权限不够?ODBC数据源管理员可以创建系统DSN,因为它在启动时请求权限提升(启动工具时您是否看到UAC的问题?)。尝试使用提升的权限运行应用程序:在资源管理器中找到可执行文件,在其上按鼠标右键,然后选择“以管理员身份运行”命令。