判断某个 UWP 程序是否已经安装

2021年1月20日 没有评论

在一些代码逻辑里,经常需要判断指定的 UWP程序是否已经安装,其实微软已经提供了相应的API了,无论是Win32还是原生的 UWP程序都可以直接使用,这就是 PackageManager,其文档地址见这里

但是这个类,微软给添加了一个标记 [Windows.Foundation.Metadata.WebHostHidden],所以如果是网页里就无法调用了。为了规避掉这个问题,发现了一个类似hack 的方式。

就是使用 QueryUriSupportAsync 方法,向请求的UWP程序发送一个不存在的协议字符串,然后检查其返回值。返回的是一个枚举类型,也就是说,如果是 0(已安装)或者3(不支持该协议),就表明这个程序对于当前用户来说是已安装的。

下面是一段 js 的调用示例代码:

static queryUriSupport(uri, packageName) {
    return Windows.System.Launcher.queryUriSupportAsync(
        new Windows.Foundation.Uri(uri),
        0,
        packageName
    );
}

简单、暴力、直接,恰好解决了网页里的权限问题。

分类: 日常 标签:

NTLM SSP攻击服务器解决办法

2020年12月16日 没有评论

最近无聊就翻看了下服务器的日志情况,看到有好多攻击记录,都是使用 NtLmSsp 暴力破解,查了一下,都是使用的俄罗斯那边的代理,创建了防火墙规则,过滤了一波IP地址,又观察了2天,发现还有有部分攻击,不过把尝试频率给降低了。

按照网上的方式,打开本地安全策略管理,按下图修改。

下面是修改前的默认值

经过测试,发现仅仅拒绝所有域账户还是会存在攻击的情况。直接拒绝所有账户,世界就清净了,当然了,远程桌面也别想用了,使用别的方式咯。

分类: 日常 标签:

python 实现 windows 身份验证登录

2020年12月1日 没有评论

最近在打算写个工具去获取车辆的停车信息,以提醒自己及时地挪车。

常规地讲,需要先登录内网系统查看,内网在域里,使用了单点登录和 winodws 身份验证机制。Python 里大家使用的比较多的是 requests 库,但是它不支持这样的登录。

我们就需要别的库来帮忙了,经过一番搜索,发现 requests_ntlm 满足要求。

import requests
from requests_ntlm import HttpNtlmAuth

response = requests.get(url, auth=HttpNtlmAuth(“name”, “password”))

经过实际验证,这个库会有2次的401错误请求。

顺便也搜索了下如何使用 .Net 来获取,看起来更简单:

string url = “http://adm.xxxx.com/Biz/ParkingCarOverTime/List_Employee.aspx”;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.PreAuthenticate = true;
NetworkCredential credential = new NetworkCredential(“name”, “password”);
request.Credentials = credential;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Console.WriteLine($”Authentication successful {response.StatusCode}”);
StreamReader sr = new StreamReader(response.GetResponseStream());
Console.WriteLine(sr.ReadToEnd());

不要问细节,问就是使用 PreAuthenticate 属性

分类: Python, 日常 标签:

Python 提取图片的主体颜色

2020年11月5日 没有评论

如果要计算一个图片的平均色或者是主题色,过去的做法是遍历图片的像素点,然后分别针对R\G\B做加权平均。但是这样会产生一个意料之外的结果,就是这个平均值的颜色,在这个图片上根本就没有出现过。它仅仅是数学意义上的平均值。

所以另外一种思路就是根据图片里的颜色做聚类分析,只在已经存在的颜色范围里计算。这里可以使用 k-means 传统机器学习算法。

from skimage import io
from sklearn.cluster import KMeans
import numpy as np

# k-means中的k值,即选择几个中心点
k = 3

img = io.imread('city.jpg')
# 转换数据维度
img_ori_shape = img.shape
img1 = img.reshape((img_ori_shape[0] * img_ori_shape[1], img_ori_shape[2]))
img_shape = img1.shape

# 获取图片色彩层数
n_channels = img_shape[1]
# 构造聚类器
estimator = KMeans(n_clusters=k, max_iter= 4000, init='k-means++', n_init=50)
estimator.fit(img1) # 聚类
centroids = estimator.cluster_centers_  # 获取聚类中心

# 生成一个可视化矩阵
result = []
result_width = 200
result_height_per_center = 80
for center_index in range(k):
    result.append(np.full((result_width * result_height_per_center, n_channels), 
    centroids[center_index], dtype=int))
result = np.array(result)
result = result.reshape((result_height_per_center * k, result_width, n_channels))
# 保存矩阵到图片
io.imsave('result.jpg', result)

最后放上测试使用的图片,有兴趣的同学可以试一试,顺序有可能不一样,但是颜色应该是这几个。

分类: Python, 日常 标签:

SoundTouch

2020年10月1日 没有评论

SoundTouch是一个开源的音频处理库,其官网(http://soundtouch.surina.net),该库支持在windows、GNU、android平台的安装,有编译好的库也有源码。

主要实现包含变速、变调、变速同时变调等三个 功能模块,能够对媒体流实时操作,也能对音频文件操作。

Soundtouch支持音频的变时不变调处理(tempo),变调不变时处理(pitch),和变时变调处理(playback rate),在soundtouch的可执行命令里对应tempo、pitch、rate。

分类: 一句话, 日常 标签: ,

获取Firefox当前打开的标签页地址

2020年9月3日 没有评论

说起三大浏览器,当然少不了火狐浏览器了。我们继续探讨如何获取该浏览器的当前标签页地址。

首选我们需要下载 NDde.dll 这个文件,添加其引用。

using NDde.Client;

DdeClient dde = new DdeClient("Firefox", "WWW_GetWindowInfo");
dde.Connect();
string url = dde.Request("URL", int.MaxValue);
dde.Disconnect();

MessageBox.Show(url);

虽然是要借助于第三方的库,但是可用快速实现 Demo 也是蛮不错的选择了。

关于NDde,原来的官网已经停止维护了,我看Github上有一个fork该项目的地址,https://github.com/anphonic/NDde 大家可以移步看看。

分类: 一句话 标签:

获取IE当前打开的标签页地址

2020年8月3日 没有评论

在前面的文章中,有分享获取chrome标签页地址的代码。现在,再来看看如何查找到 IE标签页的地址。

首先,我们需要添加2个引用:

1、引用c:\windows\system32\SHDocVw.dll

2、引用COM组件Microsoft HTML Object Library

SHDocVw.ShellWindows sws = new SHDocVw.ShellWindows();
StringBuilder sb = new StringBuilder();
foreach (SHDocVw.InternetExplorer iw in sws)
{
	sb.AppendLine(iw.LocationURL);
}
MessageBox.Show(sb.ToString());

这里iw是所有一打开的IE,包括IE本身或者基于IE内核的企业浏览器,还包括我的电脑打开的所有窗口。
你可根据实际情况筛选掉 file 开头的地址。http开头的都是当前打开的IE的地址。

分类: 一句话, 日常 标签:

图像形态学处理cv2.dilate膨胀函数

2020年7月29日 没有评论

在前面接触到阈值处理函数后,又继续了解到 opencv 的腐蚀函数和膨胀函数。腐蚀函数可以用来处理图片里不重要的噪音或者纹理。而膨胀函数如字面意义,处理后图像看起来像气球涨起来了一样,可以借此兼容图片里的孔洞或者边缘的缺陷。

膨胀函数定义如下:
cv2.dilate(src, kernel, iteration)

参数说明:
src表示输入的图片,
kernel表示方框的大小,
iteration表示迭代的次数,迭代次数越多,膨胀幅度越大

膨胀操作原理:存在一个kernel,在图像上进行从左到右,从上到下的平移,如果方框中存在白色,那么这个方框内所有的颜色都是白色。有此可见,这个kernel 的尺寸选择,就比较重要了。

下面是效果示意图:

左上角部分是添加了噪音部分,左下角是对其进行腐蚀后的图,可以看到,基本上可以得到我们所需要的内容了。右下角是针对腐蚀后的图进行膨胀,这2个函数都是只进行1次迭代。结果可以看到和原图差不多了。

分类: Python 标签:

Yolo探索之 OpenCV 安装

2020年7月6日 没有评论

其实 opencv 对于 windows 平台是很友好的,先从这里下载最新版本的opencv的包,看起来是个exe,其实就是一个自解压缩包,解压缩完成后,界面就会自动消失,所以大家不要慌。

我这里就给放到了 c:\tools 目录下。

再接下来就是要添加环境变量了,在 opencv\build 目录下,有一个setup_vars_opencv4.cmd 文件,在命令行下以管理员权限执行它,就会增加一部分环境变量。

然后【我的电脑(右键)】->【属性】->【高级系统设置】->【高级(标签)】->【环境变量】->“双击”系统变量中的Path->在变量值里面添加相应的路径。

由于目录下有 vc14 和 vc15 两个目录,所以建议把这两个都给加进去,例如 C:\Tools\opencv\build\x64\vc15\bin。

还有最后一步,就是重启系统以便生效。我没有重启系统,后面编译 yolo 的时候就报错了。所以为了稳妥起见,重启下还是比较好。

分类: AI, 一句话 标签: ,

获取chrome当前标签页的地址

2020年7月3日 没有评论

在评估一个demo的时候,有一个需求是要获得用户当前浏览器正在访问的网页是否命中我们的白名单,如果是的话,则会开启一系列的优化模式设定。

经过一番搜索,发现可以使用微软的自动化测试框架来间接满足我们的要求。

MS UI Automation是MSAA技术的一个替代品:即让控件和应用程序具有更好的可达性(accessible)。简单来讲,它就是几个dll,提供了一套API和Interface,及其相应的模式,让软件的开发者遵循该模式去实现相应的interface,从而软件的使用者(不仅仅是客户,还包括例如测试人员想编写一些自动化测试代码来完成程序相关的业务逻辑)能更好的使用该软件。

在UI Automation中,所有的窗体、控件都表现为一个AutomationElement, AutomationElement 中包含此控件或窗体的属性,在实现自动化的过程中,我们通过其相关属性进行对控件自动化操作。对于UI用户界面来说,所有显示在桌面上的UI,其实际是一个UI Tree,根节点是desktop。我们可以使用UI Spy或者是SPY++来获得Window和Control的相关信息。在UI Automation里,根节点表示为AutomationElemnet.RootElement. 通过根节点,我们可以通过窗体或控件的Process Id、Process Name或者Window Name找到相应的子AutomationElement,例如 Dialog、Button、 TextBox、Checkbox等标准控件,通过控件所对应的Pattern进行相关的操作。

Process[] procsChrome = Process.GetProcessesByName("chrome");

if (procsChrome.Length <= 0)
{
    Console.WriteLine("未找到 chrome 进程");
}

foreach (Process proc in procsChrome)
{
    // the chrome process must have a window 
    if (proc.MainWindowHandle == IntPtr.Zero)
    {
        continue;
    }

    AutomationElement root = AutomationElement.FromHandle(proc.MainWindowHandle);
    Condition conditions = new AndCondition(
        new PropertyCondition(AutomationElement.ProcessIdProperty, proc.Id),
        new PropertyCondition(AutomationElement.IsControlElementProperty, true),
        new PropertyCondition(AutomationElement.IsContentElementProperty, true),
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)
    );

    AutomationElement bar = root.FindFirst(TreeScope.Descendants, conditions);

    if(bar != null)
    {
        var url = bar.GetCurrentPropertyValue(ValuePatternIdentifiers.ValueProperty).ToString();
        Console.WriteLine(url);
    }
}

不过,根据网上的说法,这样的代码只在v53以上版本才有效果。目前浏览器版本都7、80了,对于一个demo而言,应该可以满足大部分要求了。

分类: 日常 标签: