0

我正在编写一个将所有内容存储在 mysql 数据库中的 c++ 程序。我想避免弹出 Windows 安全窗口并询问 mysqld 是否可以拥有特权。如果我单击取消(响应防火墙窗口),程序仍然可以正常运行,因为一切都是本地的。

我正在尝试使用带有 --skip-networking 标志的命名管道来避免这个防火墙窗口。

开始编辑:

我正在使用 mysqld 的便携式版本。它没有管理员权限。(感谢 Ben 指出这是一条重要信息)

结束编辑

我正在使用以下命令启动 mysqld 服务器:

C:\tmp_report\12345\mysqld\mysql\bin\mysqld --user=root \
--basedir="C:\tmp_report\12345\mysqld\\mysql" \
--datadir="C:\tmp_report\12345\mysqld\data" \
--pid-file="C:\tmp_report\12345\mysqld\mysql.pid" \
--log-error="C:\tmp_report\12345\mysqld\mysql.err" \
--skip-networking \
--enable-named-pipe

这可行,我可以使用以下命令行语句连接到数据库:

mysql --pipe -uroot 

我正在尝试通过 c-api 连接如下:

unsigned int mysql_timeout=200;
unsigned int protocol=MYSQL_PROTOCOL_PIPE;
bool mysql_reconnect=true;
bool mysql_local_infile=true;

if (mysql_options(conn,MYSQL_OPT_CONNECT_TIMEOUT, (char *)&mysql_timeout)){*logstream<<"mysql option error connect_timeout";}

if (mysql_options(conn,MYSQL_OPT_READ_TIMEOUT, (char *)&mysql_timeout)){*logstream<<"mysql option error read_timeout";}

if (mysql_options(conn,MYSQL_OPT_WRITE_TIMEOUT, (char *)&mysql_timeout)){*logstream<<"mysql option error write_timeout";}

if (mysql_options(conn,MYSQL_OPT_RECONNECT,                   &mysql_reconnect)){*logstream<<"mysql option error reconnect";}

if (mysql_options(conn,MYSQL_OPT_LOCAL_INFILE,                &mysql_local_infile)){*logstream <<"mysql option error local_infile";}

if (mysql_options(conn,MYSQL_OPT_NAMED_PIPE,                  NULL)){*logstream<<"mysql option error MYSQL_OPT_NAMED_PIPE";}
if (mysql_options(conn,MYSQL_OPT_PROTOCOL,            (char *)&protocol))          {*logstream<<"mysql option error protocol";}

if (!mysql_real_connect(conn,
        "localhost", // SERVER
        "root",      // USER
        NULL,   // PASS
        NULL,   // DATABASE
        0,    // port
        NULL, // socket
        0     // client_flag
    )){
    *logstream<<"Database::connect mysql_real_connect failed"<<endl;
    *logstream<<mysql_error(conn)<<endl;
    conn=NULL;
}

这个 mysql_real_connect 调用的结果是:

Database::connect mysql_real_connect failed
Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0

如果我使用 TCPIP 连接,除了弹出 Windows 防火墙外,一切正常。我真的很想在不需要用户单击防火墙窗口上的取消的情况下完成这项工作。

非常感谢任何帮助!

4

2 回答 2

1

如果 MySQL 有意仅本地化,您只需将其配置为仅侦听本地地址。把它放在你的my.cnf文件中:

bind-address     = 127.0.0.1

否则使用netsh advfirewall或类似配置防火墙以允许 MySQL。这通常会在您安装 MySQL 时完成。

例子:

或从脚本:

对于没有或不需要管理员权限的一次性安装,您可以使用不可路由的 IP 地址和随机端口配置本地通信。

您可以通过添加--bind-address=127.0.0.1 --port=62190到命令行来实现此目的。

除非您是管理员,否则您将无法更改防火墙规则,并且侦听命名管道通常也需要管理权限。创建共享内存部分需要 SeCreateGlobalPrivilege,因此基本上适用相同的限制。

于 2012-11-06T15:44:18.527 回答
-1

即使在当前 C 连接器 6.0.2 中使用管理员运行的 mysql 服务器也是一个问题。这里报告了错误:http ://bugs.mysql.com/bug.php?id=41860 我需要找到一个版本没有它的mysql C连接器。

于 2012-11-26T16:50:21.987 回答