存档

‘日常’ 分类的存档

Windows Server禁用SSL 3.0

2015年3月4日 没有评论

今天衣服自己洗在对网站的SSL证书续费的时候,发现网站提供了一个安全工具,顺便就用了一下,发现有个SSL 3的信息泄漏漏洞。

攻击者如何利用此漏洞?

在人为干预 (MITM) 攻击中,攻击者可能使加密的 TLS 会话降低,强制客户端使用 SSL 3.0,然后强制浏览器执行恶意代码。此代码向目标 HTTPS 网站发送许多请求,其中如果存在以前经过身份验证的会话,则会自动发送 Cookie。这是要利用此漏洞所必需的条件。攻击者然后可以截取此 HTTPS 通信,并通过利用 SSL 3.0 中 CBC 分组密码的漏洞,可以对加密通信的某些部分(例如身份验证 Cookie)进行解密。
攻击者可能利用此漏洞执行什么操作?
成功利用此漏洞的攻击者可以对加密通信的某些部分进行解密。
造成此漏洞的原因是什么?
SSL 3.0 中使用的 CBC 加密算法存在漏洞。

在windows server服务器中,基本上都使用的是IIS,而要修复该漏洞的话,需要从注册表入手。修复方式如下:

打开服务器注册表编辑器,找到路径 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols

在下面新建一个 SSL 3.0的项,然后在右边新建一个Dword 格式的键值,名称为Enabled,值为0.

重启服务器即可。

而在微软官方的文档中,Enabled 居然被翻译成中文,导致无法生效。

树莓派/香蕉派语音合成

2015年3月3日 没有评论

自从衣服自己洗入手了香蕉派(banana pi)后,已经过去了很长时间了。
其实这些时间里,一直在解决语音合成的问题。按照当时的初衷是想做一个有点智(dou)能(bi)味道的东西。在olay怀孕期间,做了一个定时任务,每天定时播放胎教音乐,不过现在看起来小红薯似乎对音乐也没有多大兴趣。

然后第二步是打算做天气的定时语音预报,一直比较中意的是科大讯飞的语音合成技术。衣服自己洗本来就对Linux编译特别不熟悉,在他们的开放平台上申请了个appid后,就走上了自我折磨的不归路哇。

由于香蕉派上安装的是Lubuntu系统,硬件配置不算好,所以打算在电脑上把代码编译后再复制到香蕉派上。科大讯飞官方提供的SDK,并没有c#的版本,就考虑用c++编译一个仅仅负责语音合成的程序,然后用c#来写逻辑。Java什么的还是算了吧,看到java一大堆的配置就头疼。

mono安装下来,跑了个命令行似乎没有什么问题,于是开始处理语音合成部分。装了个Ubuntu虚拟机,编译官方的demo后拷贝到香蕉派上,运行失败。突然想起来banana pi是基于arm系统,而虚拟机里的ubuntu是基于x86的。

那么退一步,直接在香蕉派上编译应该就可以了吧。
于是直接远程桌面香蕉派,安装了CodeLite开发环境,上传源码,编译失败,一番搜索发现是要添加 -ldl 选项,但是一看官方的build脚本,是有这个选项的。后来各种尝试后,万万没有想到,应该把 -ldl 放到编译命令的最后面。当然咯,-pthread 也是一样的道理,这里就不多说了。

坑的眼睛都睁不开。

修改了编译脚本后,可以正常编译了,但是运行失败,估计是官方提供的 libmsc.so 库格式不对。
于是发邮件,对方说需要提供appid和交叉编译的名称,于是又网上搜索交叉编译,发现大家用的基本上是arm-linux-gcc,回邮件。一周后,交叉编译提供的 libmsc.so 库发过来,重新引用编译。
运行提示找不到 libmsc.so 库。再次网络搜索,发现Linux系统中对于共享库文件默认是在固定的几个目录里,而不像windows那样,先从程序的运行目录里查找dll文件。添加进去还是不行。接着网络搜索,发现还要设置 export LD_LIBRARY_PATH 为库文件存放的目录,同时还需要sudo ldconfig -v来刷新。

多么纠结的Linux啊~泪流满面。喔,忘记说的是,衣服自己洗还不会C++,为了这事情,又买了C++开发的书来学习,精神可嘉有没有~

运行还是提示找不到libmsc.so文件,官方论坛里也没有有效的答复,最后我放弃了。

今天在论坛里发现官方释放了一个针对树莓派的demo,但是提供的是一个静态库a文件。抱着试一试的想法,上传,编译失败。网上搜索也没有个所以然出来。照葫芦画瓢自己写编译脚本运行还是不行。突然想起来前面的 -ldl 要放到最后面的问题,于是添加到最后。终于编译成功,运行成功。

很是激动有没有,这就意味着困扰了好几个月的问题终于解决了。后面就好说了,获取天气预报,用c#来处理,这个实现,就放到后面的博客里描述吧。

女汉子降临

2015年2月25日 1 条评论

如果要衣服自己洗来评价说2月份最重要的事情,莫过于女汉子的降临。代码写的好,萝莉生的早。

2月4日,农历腊月16,立春,顺产,6斤8两。

妈妈辛苦了,当时我还不在身边,难以想象她一个人是如何害怕和坚强的熬过那几个小时。

对于属相,还有一个故事,现代对于属相有2种标准,一个是按照黄历,每年的立春属于新的属相开始。而另外的一种说法是从初一的零点开始。小萝莉恰好是立春那天出生,但是又没有过农历新年。衣服自己洗还很纠结了一番。

后来发现,那天的立春是从上午的11点58分开始,而小萝莉是早上5点多生的。所以无论是哪一种标准,都是属马,巧妙避免了这种属相的选择尴尬性。

过年的时候,衣服自己洗本还担心她会收到鞭炮的惊吓,结果女汉子是睡的各种舒服,一点都没有收到干扰。在稍微宽慰的时候,又担心她是不是有先天性的听力问题,后来发现有时在关门的时候,她会受到惊吓,看起来应该是可以听到声音的。

小萝莉出生在过年前,怕冬天给冻住了,一个不留神,结果给捂住了,胳膊上一大片伤口,把人都给心疼坏了,大院里的小妹妹恰好是新生儿科的护士,又赶紧抱去医院检查,医生只是担心会引起败血症,好在女汉子体温正常,又能吃能睡,开了百多邦就回来了,一涂抹第二天果然就好了很多。

小妹妹在去找医生检查的时候,由于我们只能站在外面等待,远远的我看着医生胸前的铭牌,豁然就是我高中同班同学的名字,而且从外貌上我一眼就认出来了。一来时间快10年了,我怕认错了。另外一个原因她还是当年我的女神,现在看着心里仍然觉得很腼腆。所以最后我也没有主动打招呼。

回家的这2个星期里,几乎每天晚上都睡不好。从12点就到5、6点钟都是折腾的时候,10分钟左右就要换一次尿布,自己当父母了才知道当初爸妈的辛苦。

最后,衣服自己洗打算给小萝莉的乳名叫做小红薯,哈哈。当初怀孕产检回去的路上,会买个烤红薯吃,小萝莉出生后,也吃了很多红薯稀饭,小红薯,妥妥的。

分类: 日常 标签: ,

Python初试

2015年1月13日 没有评论

工作上最近有遇到一个事情,服务器收集的日志信息里,对于日期格式的字符串描述采用的是yyyy-M-d的方式,而后端逻辑程序对这块的处理的不够(这个让衣服自己洗很是迷惑),但由于跨部门利益关系,问题的解决优先级不够高。

于是,一个折衷的思路就是在后端逻辑处理日志前,先通过某种方式来个预处理。递归遍历目录下的所有子目录和文件,打开文件,正则查找到要处理的日期字符串,替换,然后保存。看起来不太复杂。

由于是Linux服务器,同时也因为一些原因,服务器上也无法安装mono,所以通过c# 写处理程序的方式就行不通。剩下的就分为下面几种思路:

  1. shell 命令
  2. perl/python 脚本
  3. C/C++ 程序

问题就在于我对这些都不会,最开始是想用c++来处理。然后网上搜索了一通资料,对于跨平台的c++,也碰到些问题,例如io.h头文件是没有的,对于正则估计还得用boost之类的,然后后面使用 strncat 这样的函数简直是给弄恶心了。所以在连抄带猜地写完目录遍历后,我就放弃了。Java 程序,我觉得还是算了吧。

我觉得为解决这个事情去学一个语言,成本是不是太高了点,想抱个大腿。找到了@屈屈,他很快就给出了答案,这就是差距。

for i in `ls *.txt`;do mv -f $i `echo $i | sed ‘s/-\([0-9]\)/0\1/g’`;done

虽然不能完全看懂啥意思,不过看起来很绚丽,对不对~多谢屈屈的帮助。

后来网上又下了个Python电子版教程,简单看了下,网上各种搜索和抄袭,最后弄了个Python的脚本,也算是勉强交差吧。

code

import os
import re
import sys

dir = “/Users/mmcer/temp”
if len(sys.argv) > 2:
dir = sys.arg[1]

def check(dir):
for f in os.listdir(dir):
file = os.path.join(dir,f);
if os.path.isdir(file):
check(file)
#pass
elif os.path.isfile(file):
if(f.startswith(“.”)):
#filter Linux system file
pass
else:
print “path is ” + file
think(file)

def think(path):
file = open(path,”r”)
content = file.read()
file.close();

reg = re.compile(“(\d{4})-(\d+)-(\d+)”,re.M)
matches = reg.findall(content)

for match in matches:
year = match[0]
month = match[1]
day = match[2]
old = year + “-” + month + “-” + day

_year = match[0]
_month = match[1]
_day = match[2]

if len(year) == 2:
_year = “20” + year
if(len(month) == 1):
_month = “0” + month
if(len(day) == 1):
_day = “0” + day

newStr = _year +”-” + _month + “-” + _day

content = content.replace(old,newStr)

file = open(path,”w”)
file.write(content)
file.close()

check(dir)

两种思路都提供给对方了,至于如何选择就看人家怎么使用了。

分类: 日常 标签:

pod setup 失败解决

2014年12月11日 没有评论

cocoapods 是 iOS 上不错的包依赖管理软件,在前面的文章里衣服自己洗是有做简单的介绍。

苹果发布了Mac OS X 10.10 后,就安装了新系统和 XCode 6,然后顺便执行了 sudo gem update –system

然后噩梦就来了,这次要创建一个新的项目,写好 podfile 后,结果安装失败。然后网上一搜索,发现 OS X 10.10后有点问题,需要先卸载 cocoapods,然后再重新安装。各种细节和其它诸如Command Line Tools之类的就不展开说了。

安装倒是成功了,可是在执行 pod setup时,总是失败。提示 There was an error reading ‘/Users/mmcer/.cocoapods/repos/master/CocoaPods-version.yml ,然后给了一个官方的URL地址。

按照该地址访问 http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/,使用里面的方法删除本地文件夹

sudo rm -rf ~/.cocoapods/repo/master/
sudo setup

仍然失败,衣服自己洗以为是网络、CDN或者国家防火墙的问题,于是回家后又是各种环境,还是不行。网上是各种搜索,大家的解决方法和上面的几乎是一样的。

后来就闲逛github,在他们的 issue 里发现了居然别人也有相同的问题,并且自己摸索解决了。这里真是要汗颜下自己,没有一早想到这里不说,还懒的自己去摸索。

原因就是曾经的更新导致,具体就是 psych 这个组件,卸载然后安装一个低版本就可以了。github 里是用的2.0.0,但是我用了一个略高的版本发现也是可以的。

sudo gem uninstall psych
sudo gem install psych -v 2.0.0

帖子里还有个人是把所有的gem安装的软件都卸载了然后重装发现也可以解决问题,衣服自己洗觉得太麻烦就没有采用。

之后再重新执行 pod setup 和 pod install 都正常了。浪费了3天时间,对进度还是有很大影响的,不过这个是题外话了。

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

c#创建大于屏幕尺寸的窗体

2014年11月16日 没有评论

最近的一个星期,衣服自己洗一直在折腾一件事情,最终才得以解决,现在拿出来和大家分享。

问题是这样的,如何生成一个winform 窗体,使得它的尺寸要比当前屏幕还要大。

我是在 c# 中碰到的,但是对于其它语言应该也是一样的。开始的时候我也为是MDI的限制,后来发现这个限制对一般窗体都适用,网上资料也显示,对于窗体的尺寸设置,无论是 Size 还是单独的宽度、高度,如果超过了屏幕的尺寸,系统会自动给截断。

例如,对于1366*768 分辨率、100%的DPI,如果你创建了一个窗体,并设置其尺寸为 1400*900,那么最终的窗体尺寸会是 1478*780,多余的就不显示了,当然也不会崩溃。系统对于宽度和高度会允许多添加 12像素。如果是 125%的DPI,那么这个值是 16像素。但是不会允许更多。

由于对于windows桌面应用程序驾驭能力的不足,只好请教他人。对于这个问题,大家集中表现为两种情况,一种是表示从来没有接触过MDI表示不会,毕竟是从MDI程序发现的;另外的尝试一把发现确实不太好解决劝我放弃。只好自己一个人坚持下去寻找原因。

我相信这个需求一定是可以实现,并且很简单,只是我暂时没有找到方法而已。

后来看到一个Delphi的程序实现了我想要的效果,我通过spy++比较程序间的差异,并辗转和人家交流才明白,原来是要去掉一个样式并重新设置大小。但是我这边一直没有效果。后来才发现是常量声明错误,我给设置成负值了。汗~

首先,获取窗体的当前样式,然后去掉WS_THICKFRAME样式,之后再重新设置窗体的位置和尺寸即可。如我开始所想,确实很简单,只是想到这里不太容易。如果是 c++ 之类的语言,可以在窗体(包括MDI窗体)构造的时候设置就可以了,c# 给封装起来了,所以只好放后面设置。

申明如下:

[DllImport(“user32.dll”, SetLastError = true, CharSet = CharSet.Auto)]
public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int newLong);

[DllImport(“user32.dll”, SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport(“user32.dll”)]
public static extern int SetWindowPos(IntPtr hwnd, int hwndInsertAfter, int x, int y, int width, int height, int flags);

[DllImport(“shell32.dll”)]
public static extern IntPtr ShellExecute(IntPtr hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);

public static int GWL_STYLE = (-16);
public static int WS_THICKFRAME = 262144;
public static int HWND_TOP = 0;
public static int SWP_SHOWWINDOW = 64;
public static int SW_SHOW = 5;

封装起来,这样调用会比较方便,
public void SetNewSize(int width, int height)
{
int style = GetWindowLong(this.Handle, GWL_STYLE);

SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_THICKFRAME);
SetWindowPos(this.Handle, HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);
}

最后说几个小细节作为结尾吧,对于c#而言,这个调用不能放在构造函数里,因为会被后面系统自动设置给覆盖掉,应该在 frmChild.Show()之后才有效。衣服自己洗这里也是坑了很久。另外大家可以看代码是如何去掉WS_THICKFRAME样式的,还可以思考下为什么要先获取窗体样式而不直接设置。

这下算是解决了心里的一个疙瘩,不知道做技术的是不是都这样。

分类: 日常 标签: , , ,

代理网络使用远程桌面

2014年10月12日 没有评论

衣服自己洗在阿里云弄了一个主机, 放随便搞的一些东西。

经过一段时间的观察,发现经常有人在扫描远程桌面和SQL Server,尝试登录。阿里云的云盾似乎没有很好的过滤掉。看着每天的攻击很是担心,虽然服务器上几乎没有跑任何程序,我承认我的服务器就是个装饰。

为了安全起见,同时又可以方便使用,衣服自己洗修改了远程桌面和SQL Server的默认端口,把3389 修改为8888,过了几天再去检查服务器,发现攻击记录就少了很多了。

有一天在单位有事情需要远程访问服务器,远程桌面打开失败,突然想起来单位是使用的代理上网,服务器远程桌面使用的8888端口被代理给屏蔽了,但是系统的远程桌面又不支持代理设置,那一刻很是抓狂。

老实说,公司的代理网络有时候很不够好。

事情当时就这么过去了,可是衣服自己洗很是不甘心。凭什么呀?于是在网络上各种搜索,想找到解决方案。

要求是这样的:打开生效退出后也不对系统造成影响,功能尽量简单,满足要求即可。

过了好几个月后,终于找到了方法,就是 CCProxy + Proxifier。这2个软件网上都有单独的介绍,我也分别尝试了,都失败了,后来看到一个帖子后才有的思路,重新尝试,果然有效果。

我猜测原理是酱紫的,CCProxy提供Socket到http的转换,而Proxifier则是为不支持代理的软件提供代理的支持。网上很多失败的情况,都是单独使用了其中的一个。

首先安装2个软件,软件的安装没有先后顺序。接下来来配置CCProxy,在设置界面里勾选Socket/MMS,记住端口号 1080,下方会显示局域网地址192.168.30.1,也需要记下来后面需要使用的。然后再点击高级,切换到二级代理选项卡,选择启用二级代理,并输入办公网络上网代理的地址。然后确定即可。

对于Proxifier,先选择菜单栏的配置文件/代理服务器,然后点击添加,输入上面CCProxy里局域网地址192.168.30.1,和端口号1080。当然各位同学的IP地址可能不是这个,只要保证2个软件的IP是一样的即可。勾选Socket 5 协议,点击确定。

还差一步,选择菜单栏的配置文件/代理规则,然后点击添加,在新窗口里输入你想代理的程序,我们是要使用远程桌面,所以这里就属于远程桌面程序名称mstsc.exe,下方的动作就选择刚才设置的代理。效果如下图所示:

proxifier

点击确定,并勾选生效。界面看起来就应该是下面的样子:

mstsc_rule

到这里就配置完毕,大家可以放心使用拉。允许远程桌面,真的是可以访问了,反正衣服自己洗感觉很爽。

上面最后一步是设置需要代理访问的程序,不仅仅是远程桌面,衣服自己洗还设置了MongoVUE也访问代理,这样做是为了尽量减少干扰,毕竟办公网络其它程序例如QQ、浏览器还是可以上网的,所以这个步骤大家灵活处理好了。

iOS使用keychain存储数据

2014年9月23日 没有评论

在某个周六的时候,我跑去听了一个淘宝举办的无线交流会,对于安全来说还是蛮有收获的。回来后在网上找相关资料,看到一个关于使用 keychain 来存储数据的方案,思路比较不错。

使用keychain,有2点好处。

1、数据相对使用NSUserDefaults,更安全一点。

2、可以用来进行应用间的数据共享。

下面给出通用类代码,首先是头文件

KeychainManager.h

 

#import <Foundation/Foundation.h>

@interface KeychainManager : NSObject

+ (void)save:(NSString *)key withValue:(id)value;

+ (id)get:(NSString *)key;

+ (void)deleteData;

@end

接下来,是具体的实现代码

KeychainManager.m

#import “KeychainManager.h”

@implementation KeychainManager

static NSString * const KEY_IN_KEYCHAIN = @”com.5danyuan.app”;

+ (void)save:(NSString *)key withValue:(id)value{

    NSMutableDictionary *dic = [NSMutableDictionary dictionary];

    

    [dic setObject:value forKey:key];

    

    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                                  (__bridge_transfer id)kSecClassGenericPassword,

                                  (__bridge_transfer id)kSecClass,

                                  KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrService,

                                  KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrAccount,

                                  (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,

                                  (__bridge_transfer id)kSecAttrAccessible,

                                  nil];

    //删除旧数据

    SecItemDelete((__bridge_retained CFDictionaryRef)query);

    [query setObject:[NSKeyedArchiver archivedDataWithRootObject:dic] forKey: (__bridge_transfer id)kSecValueData];

    SecItemAdd((__bridge_retained CFDictionaryRef)query, NULL);

}

+ (id)get:(NSString *)key{

    NSMutableDictionary *dic = nil;

    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                                  (__bridge_transfer id)kSecClassGenericPassword,

                                  (__bridge_transfer id)kSecClass,

                                  KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrService,

                                  KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrAccount,

                                  (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,

                                  (__bridge_transfer id)kSecAttrAccessible,

                                  nil];

    [query setObject: (id)kCFBooleanTrue forKey: (__bridge_transfer id)kSecReturnData];

    [query setObject: (__bridge_transfer id)kSecMatchLimitOne forKey: (__bridge_transfer id)kSecMatchLimit];

    CFDataRef keyData = NULL;

    if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)query, (CFTypeRef *)&keyData) == noErr) {

        @try {

            dic = (NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData: (__bridge_transfer NSData *)keyData];

        }

        @catch (NSException *exception) {

            NSLog(@”Unarchive of %@ failed:%@”,KEY_IN_KEYCHAIN,exception);

        }

        @finally {

            

        }

    }

    

    if(dic != nil){

        return [dic objectForKey:key];

    }

    

    return nil;

}

+ (void)deleteData{

    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                                  (__bridge_transfer id)kSecClassGenericPassword,

                                  (__bridge_transfer id)kSecClass,

                                  KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrService,

                                  KEY_IN_KEYCHAIN,(__bridge_transfer id)kSecAttrAccount,

                                  (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,

                                  (__bridge_transfer id)kSecAttrAccessible,

                                  nil];

    

    SecItemDelete((__bridge_retained CFDictionaryRef)query);

}

@end

 对于通用类而言,提供了3个方法,添加、删除、保存。其中,为了安全起见,防止被恶意分析,获取的get方法的返回值是 id 类型的。对于合法的使用者,自然是知道应该转换为什么样的数据类型的。

分类: iOS, 日常 标签: , , ,

c# winform添加防火墙规则支持

2014年9月23日 没有评论

在最近的一个项目中,程序需要依赖第三方应用。所以在程序启动的时候,如果第三方应用没有运行,则主动调用起来。对于网络应用程序,或者一些需要用到自定义端口的程序,在启动的时候,可能会被系统防火墙给拦截,询问用户是否需要给与权限。

有的时候,这会让人很抓狂,特别是对于某xx程序,呵呵,我真的不是在黑360。

如果一个已经被用户授权获得管理员权限的应用,如果可以顺手把防火墙规则给加上去,至少看起来不用那么纠结了。

多的不说,下面是具体的静态类。

public class FirewallHelper
{
/// <summary>
/// 添加端口号到防火墙
/// </summary>
/// <param name=”name”></param>
/// <param name=”port”>端口号</param>
/// <param name=”protocol”>TCP/UDP/ANY</param>
public static void addPort(string name, int port, string protocol)
{
//创建防火墙管理类实例
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));
//或者使用Type.GetTypeFromCLSID(new GUID(” {304CE942-6E39-40D8-943A-B913C40C9CD4}”)),
//其中, {304CE942-6E39-40D8-943A-B913C40C9CD4} 是防火墙的CLSID

INetFwOpenPort fwPort = (INetFwOpenPort)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwOpenPort”));

fwPort.Name = name;
fwPort.Port = port;
if (protocol.ToUpper() == “TCP”)
{
fwPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
}
else if (protocol.ToUpper() == “ANY”)
{
fwPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
}
else
{
fwPort.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP;
}
fwPort.Scope = NET_FW_SCOPE_.NET_FW_SCOPE_ALL;
fwPort.Enabled = true;

bool exist = false;
//加入到防火墙的管理策略
foreach (INetFwOpenPort item in manager.LocalPolicy.CurrentProfile.GloballyOpenPorts)
{
if (fwPort == item)
{
exist = true;
break;
}
}
if (!exist) {
//不存在则添加
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add(fwPort);
}
}

/// <summary>
/// 添加应用程序到防火墙
/// </summary>
/// <param name=”name”></param>
/// <param name=”path”>应用程序的完整绝对路径,包含文件名</param>
public static void addApp(string name, string path)
{
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));
INetFwAuthorizedApplication app = (INetFwAuthorizedApplication)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwAuthorizedApplication”));

app.Name = name;
app.ProcessImageFileName = path;
app.Enabled = true;

bool exist = false;
foreach (INetFwAuthorizedApplication item in manager.LocalPolicy.CurrentProfile.AuthorizedApplications)
{
if (name == item.Name)
{
exist = true;
break;
}
}

if (!exist)
{
manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(app);
}
}

/// <summary>
/// 从防火墙中删除端口号
/// </summary>
/// <param name=”port”></param>
/// <param name=”protocol”>TCP/UDP/ANY</param>
public static void delPort(int port, string protocol)
{
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));

if (protocol.ToUpper() == “TCP”)
{
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP);
}
else if (protocol.ToUpper() == “ANY”)
{
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY);
}
else
{
manager.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove(port, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_UDP);
}
}

/// <summary>
/// 从防火墙中移除应用程序
/// </summary>
/// <param name=”path”>应用程序的完整绝对路径,包含文件名</param>
public static void delApp(string path)
{
INetFwMgr manager = (INetFwMgr)Activator.CreateInstance(Type.GetTypeFromProgID(“HNetCfg.FwMgr”));

manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Remove(path);
}
}

 

因为都是静态类,要使用的时候,直接调用就可以了。

分类: 日常 标签: , ,

香蕉派远程桌面连接

2014年8月14日 没有评论

在前面的几篇文章里,衣服自己洗分享了香蕉派的一些设置,可是没有告诉各位同学,显示器是我从单位借用抱回家的,单位的网络有限制,对于软件安装什么的,都无法进行,只好带回家。大家能想象出在下班高峰的地铁上,一个抱着显示器的人是有多么艰难。

由于是借用公家的显示器,终归是要还的,所以支持远程桌面什么的,就是十分必需的了。在网上搜索了一把,基本上是2种方案,一个是使用vnc,考虑到windows上还需要安装软件,所以我给过滤掉了。第二个是直接使用windows自带的远程桌面,很多人推荐使用xrdp,估计是x remote desktop的意思吧。

sudo apt-get install xrdp

然后从家里路由器里拿到香蕉派的IP地址,接着就是远程桌面了。网上的帖子大致如此。

可是衣服自己洗远程桌面时,显示登录成功,可是始终是灰色的屏幕,没有任何东西,只有一个X鼠标。这不科学,你们知道吗!网上搜索了很久,基本上没有人遇到,只有2个人有同样的问题,可惜没有后文,我想应该是我的关键词有问题吧。

搞了很久,都没有答案,以至于衣服自己洗现在才把香蕉派的系列文章写下来。终于某一天在ubuntu的论坛里看到一个帖子。

妈蛋,原因竟然是ubuntu环境和xrdp的桌面环境冲突导致远程桌面灰屏。接下来就是各种找解决思路,功夫不负有心人,终于找到了,使用xfce4。

剩下的就简单了,xrdp 还是需要安装的,sudo apt-get install xfce4

然后呢就是 echo xfce4-session >~/.xsession,重启下xrdp的服务即可了。

这个问题虽然出现在香蕉派上,但是理论上也存在ubuntu无法远程桌面的问题。