mirror of
https://github.com/OpenVPN/openvpn.git
synced 2026-05-28 04:03:29 -04:00
win: replace wmic invocation with powershell
Since wmic has been recently deprecated and is absent on new systems, replace setting DNS domain "old-style" with powershell. Some changes to the service implementation: - remove action parameter and hardcode Set-DnsClient since this is the only used action - remove support of multiple domains, since we only pass a single domain (tuntap_options.domain) Github: fixes OpenVPN/openvpn#642 Change-Id: Iff2f4ea677fe2d88659d7814dab0f792f5004fb3 Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1183 Signed-off-by: Lev Stipakov <lev@openvpn.net> Acked-by: Gert Doering <gert@greenie.muc.de> Message-Id: <20250915062013.2555-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg32938.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
parent
520a58d51f
commit
d383d6ed62
3 changed files with 21 additions and 30 deletions
|
|
@ -383,7 +383,7 @@ out:
|
|||
}
|
||||
|
||||
static void
|
||||
do_dns_domain_wmic(bool add, const struct tuntap *tt)
|
||||
do_dns_domain_pwsh(bool add, const struct tuntap *tt)
|
||||
{
|
||||
if (!tt->options.domain)
|
||||
{
|
||||
|
|
@ -391,9 +391,14 @@ do_dns_domain_wmic(bool add, const struct tuntap *tt)
|
|||
}
|
||||
|
||||
struct argv argv = argv_new();
|
||||
argv_printf(&argv, "%s%s nicconfig where (InterfaceIndex=%ld) call SetDNSDomain '%s'",
|
||||
get_win_sys_path(), WMIC_PATH_SUFFIX, tt->adapter_index, add ? tt->options.domain : "");
|
||||
exec_command("WMIC", &argv, 1, M_WARN);
|
||||
argv_printf(&argv,
|
||||
"%s%s -NoProfile -NonInteractive -Command Set-DnsClient -InterfaceIndex %lu -ConnectionSpecificSuffix '%s'",
|
||||
get_win_sys_path(),
|
||||
POWERSHELL_PATH_SUFFIX,
|
||||
tt->adapter_index,
|
||||
add ? tt->options.domain : ""
|
||||
);
|
||||
exec_command("PowerShell", &argv, 1, M_WARN);
|
||||
|
||||
argv_free(&argv);
|
||||
}
|
||||
|
|
@ -1269,7 +1274,7 @@ do_ifconfig_ipv6(struct tuntap *tt, const char *ifname, int tun_mtu,
|
|||
|
||||
if (!tt->did_ifconfig_setup)
|
||||
{
|
||||
do_dns_domain_wmic(true, tt);
|
||||
do_dns_domain_pwsh(true, tt);
|
||||
}
|
||||
}
|
||||
#else /* platforms we have no IPv6 code for */
|
||||
|
|
@ -1625,7 +1630,7 @@ do_ifconfig_ipv4(struct tuntap *tt, const char *ifname, int tun_mtu,
|
|||
tt->adapter_netmask, NI_IP_NETMASK | NI_OPTIONS);
|
||||
}
|
||||
|
||||
do_dns_domain_wmic(true, tt);
|
||||
do_dns_domain_pwsh(true, tt);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -7024,7 +7029,7 @@ close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
|
|||
{
|
||||
if (!tt->did_ifconfig_setup)
|
||||
{
|
||||
do_dns_domain_wmic(false, tt);
|
||||
do_dns_domain_pwsh(false, tt);
|
||||
}
|
||||
|
||||
netsh_delete_address_dns(tt, true, &gc);
|
||||
|
|
@ -7050,7 +7055,7 @@ close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
|
|||
}
|
||||
else
|
||||
{
|
||||
do_dns_domain_wmic(false, tt);
|
||||
do_dns_domain_pwsh(false, tt);
|
||||
|
||||
if (tt->options.ip_win32_type == IPW32_SET_NETSH)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
#define WIN_ROUTE_PATH_SUFFIX "\\system32\\route.exe"
|
||||
#define WIN_IPCONFIG_PATH_SUFFIX "\\system32\\ipconfig.exe"
|
||||
#define WIN_NET_PATH_SUFFIX "\\system32\\net.exe"
|
||||
#define WMIC_PATH_SUFFIX "\\system32\\wbem\\wmic.exe"
|
||||
#define POWERSHELL_PATH_SUFFIX "\\system32\\WindowsPowerShell\\v1.0\\powershell.exe"
|
||||
|
||||
/*
|
||||
* Win32-specific OpenVPN code, targeted at the mingw
|
||||
|
|
|
|||
|
|
@ -1150,45 +1150,31 @@ out:
|
|||
}
|
||||
|
||||
/**
|
||||
* Run command: wmic nicconfig (InterfaceIndex=$if_index) call $action ($data)
|
||||
* Run command: powershell -NoProfile -NonInteractive -Command Set-DnsClient -InterfaceIndex %ld -ConnectionSpecificSuffix '%s'
|
||||
* @param if_index "index of interface"
|
||||
* @param action e.g., "SetDNSDomain"
|
||||
* @param data data if required for action
|
||||
* - a single word for SetDNSDomain, empty or NULL to delete
|
||||
* - comma separated values for a list
|
||||
*/
|
||||
static DWORD
|
||||
wmic_nicconfig_cmd(const wchar_t *action, const NET_IFINDEX if_index,
|
||||
const wchar_t *data)
|
||||
pwsh_setdns_cmd(const NET_IFINDEX if_index, const wchar_t *data)
|
||||
{
|
||||
DWORD err = 0;
|
||||
wchar_t argv0[MAX_PATH];
|
||||
wchar_t *cmdline = NULL;
|
||||
int timeout = 10000; /* in msec */
|
||||
|
||||
openvpn_swprintf(argv0, _countof(argv0), L"%ls\\%ls", get_win_sys_path(), L"wbem\\wmic.exe");
|
||||
openvpn_swprintf(argv0, _countof(argv0), L"%ls\\%ls", get_win_sys_path(), L"WindowsPowerShell\\v1.0\\powershell.exe");
|
||||
|
||||
const wchar_t *fmt;
|
||||
/* comma separated list must be enclosed in parenthesis */
|
||||
if (data && wcschr(data, L','))
|
||||
{
|
||||
fmt = L"wmic nicconfig where (InterfaceIndex=%ld) call %ls (%ls)";
|
||||
}
|
||||
else
|
||||
{
|
||||
fmt = L"wmic nicconfig where (InterfaceIndex=%ld) call %ls \"%ls\"";
|
||||
}
|
||||
const wchar_t *fmt = L"-NoProfile -NonInteractive -Command Set-DnsClient -InterfaceIndex %lu -ConnectionSpecificSuffix '%s'";
|
||||
|
||||
size_t ncmdline = wcslen(fmt) + 20 + wcslen(action) /* max 20 for ifindex */
|
||||
+ (data ? wcslen(data) + 1 : 1);
|
||||
size_t ncmdline = wcslen(fmt) + 20 + /* max 20 for ifindex */ (data ? wcslen(data) + 1 : 1);
|
||||
cmdline = malloc(ncmdline*sizeof(wchar_t));
|
||||
if (!cmdline)
|
||||
{
|
||||
return ERROR_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
openvpn_swprintf(cmdline, ncmdline, fmt, if_index, action,
|
||||
data ? data : L"");
|
||||
openvpn_swprintf(cmdline, ncmdline, fmt, if_index, data ? data : L"");
|
||||
err = ExecCommand(argv0, cmdline, timeout);
|
||||
|
||||
free(cmdline);
|
||||
|
|
@ -1248,7 +1234,7 @@ SetDNSDomain(const wchar_t *if_name, const char *domain, undo_lists_t *lists)
|
|||
free(RemoveListItem(&(*lists)[undo_domain], CmpWString, (void *)if_name));
|
||||
}
|
||||
|
||||
err = wmic_nicconfig_cmd(L"SetDNSDomain", if_index, wdomain);
|
||||
err = pwsh_setdns_cmd(if_index, wdomain);
|
||||
|
||||
/* Add to undo list if domain is non-empty */
|
||||
if (err == 0 && wdomain[0] && lists)
|
||||
|
|
|
|||
Loading…
Reference in a new issue