2016年01月27日

フォルダのアクセス権取得


---------------------------
■ファイル名:test.vbs
---------------------------
Option Explicit

Function getFolderAccessMask(ByVal searchFolder)

'--------------------------------------------------------
'定数
'--------------------------------------------------------

Const FullAccess = 2032127
Const Read = 1179817
Const Write = 1180095
Const Update = 1245631
Const SubFolderAndFileSpecialAccess = -536805376
Const SubFolderAndFileFullAccess = 268435456

Const FullAccessJpn = "フルコントロール(All)"
Const ReadJpn = "読み取り(RX)"
Const WriteJpn = "書き込み(RWX)"
Const UpdateJpn = "変更(RWXD)"
Const SubFolderAndFileSpecialAccessJpn = "サブフォルダーとファイルに対する特殊なアクセス権"
Const SubFolderAndFileFullAccessJpn = "サブフォルダとファイルに対するフルコントロール"

'--------------------------------------------------------
'前処理
'--------------------------------------------------------

Dim wmiFileSecSetting
Dim wmiSecurityDescriptor
Dim retValue

Set wmiFileSecSetting = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2:Win32_LogicalFileSecuritySetting='" & searchFolder & "'")
retValue = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)

'--------------------------------------------------------
'NTFSのアクセスコントロール情報取得
'--------------------------------------------------------

Dim DACL
Dim wmiAce
Dim wmiTrustee
Dim strSID
Dim strACL
Dim i
Dim accessMask

retValue = ""
DACL = wmiSecurityDescriptor.DACL
For each wmiAce in DACL
Set wmiTrustee = wmiAce.Trustee
strSID = ""
For i = 0 To UBound(wmiTrustee.SID) - 1
strSID = strSID & wmiTrustee.SID(i) & ","
Next
strSID = strSID & wmiTrustee.SID(i)

'アクセスマスクの取得
accessMask = wmiAce.accessMask

'アクセスマスクをアクセス権表示文字列に変換
strACL = ""
Select Case accessMask
Case FullAccess
'フルコントロール(All)
strACL = FullAccessJpn
Case Read
'読み取り(RX)
strACL = ReadJpn
Case Write
'書き込み(RWX)
strACL = WriteJpn
Case Update
'変更(RWXD)
strACL = UpdateJpn
Case SubFolderAndFileSpecialAccess
'サブフォルダーとファイルに対する特殊なアクセス権
strACL = SubFolderAndFileSpecialAccessJpn
Case SubFolderAndFileFullAccess
'サブフォルダとファイルに対するフルコントロール
strACL = SubFolderAndFileFullAccessJpn
Case Else
strACL = accessMask
End Select

'アクセスコントロール情報を取得
If Len(Trim(retValue)) <> 0 Then
retValue = retValue & VbCrLf
End If
retValue = retValue & """" & wmiTrustee.Domain & """"
retValue = retValue & ","
retValue = retValue & """" & wmiTrustee.Name & """"
retValue = retValue & ","
'retValue = retValue & """" & strsid & """"
'retValue = retValue & ","
'retValue = retValue & """" & wmiTrustee.Sidstring & """"
'retValue = retValue & ","
retValue = retValue & """" & strACL & """"
'retValue = retValue & ","
'retValue = retValue & """" & accessMask & """"
Next

'--------------------------------------------------------
'後処理
'--------------------------------------------------------

'オブジェクトの破棄
Set wmiAce = Nothing
Set wmiTrustee = Nothing
Set wmiFileSecSetting = Nothing
Set wmiSecurityDescriptor = Nothing

'戻り値
getFolderAccessMask = retValue

End Function

'*********************************************
' メインの処理
'*********************************************

'Const FileHeader = "Domain,Name,SID,Sidstring,ACL,accessMask"
Const FileHeader = "Domain,Name,ACL"

Dim searchFolder
Dim retValue

'対象のフォルダ
searchFolder = "C:\test"

'NTFSのアクセスコントロール情報を取得
retValue = getFolderAccessMask(searchFolder)

'アクセスコントロール情報を出力
WScript.Echo FileHeader & VbCrLf & retValue

---------------------------
■実行例
---------------------------

>cscript test.vbs //Nologo
Domain,Name,ACL
"BUILTIN","Administrators","フルコントロール(All)"
"BUILTIN","Administrators","サブフォルダとファイルに対するフルコントロール"
"NT AUTHORITY","SYSTEM","フルコントロール(All)"
"NT AUTHORITY","SYSTEM","サブフォルダとファイルに対するフルコントロール"
"BUILTIN","Users","読み取り(RX)"
"NT AUTHORITY","Authenticated Users","変更(RWXD)"
"NT AUTHORITY","Authenticated Users","サブフォルダーとファイルに対する特殊なアクセス権"

posted by rururu at 00:52| Comment(0) | TrackBack(0) | VBScript

2016年01月21日

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (10)

///*********************************************
//[既存クラスの拡張]
// String
// Unicode対応の拡充
//*********************************************

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました

// 𩸽(ほっけ)
var s = "𩸽を食べる";
console.log(s.length); // 6。1文字なのにlenthはサロゲートペアを2文字分でカウントしてしまう

// スプレッドオペレータで展開
var s1 = [..."𩸽を食べる"];
console.log(s1.length); // 5
console.log(s1[0]); // 𩸽

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (9)

//*********************************************
// let・constキーワードによる変数宣言
//*********************************************

// IE11、Edge、Firefox43.0.3、Chome47.0.2526.106 mで動きました
//
// ES6から追加される新しい変数宣言の方法で、定数値(constant value)を宣言する時に使用する。
// constを使って宣言された変数には値を代入できなくなる。

const foo = 1;
console.log(foo); // 1

// Edgeでは動きました
// IE11、Chome47.0.2526.106 m、Firefox43.0.3ではエラーになります
//
// letを使うことでブロックスコープの変数宣言が可能になる


let x = 1;
if (true) {
let x = 2;
console.log('x is ' + x); // x is 2
}

console.log('x is ' + x); // x is 1

// Edgeでは動きました
// IE11、Chome47.0.2526.106 m、Firefox43.0.3ではエラーになります
//
// C#を人にはおなじみかな「{}」は

let foo = [1, 2, 3];
{
let foo = [4, 5, 6];
console.log(foo); // [4, 5, 6]
console.log(foo[0]); // 4
}

console.log(foo); // [1, 2, 3]
console.log(foo[2]); // 3

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (8)

//*********************************************
//[既存クラスの拡張]
// MathとNumber
// 多数の算術関数の追加・・・Edgeとそれ以外のブラウザで実装が微妙に違うのかも?
//*********************************************

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました

// 常用対数
console.log(Math.log10(2)); // 0.3010299956639812

// 双曲線正接関数
console.log(Math.tanh(1)); // Edgeだと0.7615941559557648。FirefoxとChomeだと0.7615941559557649

// 32ビット乗算
console.log(Math.imul(0xffffffff, 5)); // -5

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (7)

//*********************************************
//[既存クラスの拡張]
// MathとNumber
// 2進数と8進数のリテラルが追加された
//*********************************************

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました

// 2進数
console.log(0b10) // 2
console.log(0b100) // 4

// 8進数。0oを接頭辞とする記法が追加された
console.log(0o10) // 8
console.log(0o100) // 64

// 追加された物はparseInt関数ではパースできないのでNumber関数を使う必要あり
console.log(parseInt("0b10", 2)); // 0
console.log(Number("0b10")); // 2

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (6)

///*********************************************
//[既存クラスの拡張]
// MathとNumber
// isNaNとisFiniteの改善
//*********************************************

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました

// isNaN関数は数値以外を引数に指定するとtrueを返す問題があった
// ES6で追加されたNumber.isNaNではfalseを返してくれる
console.log(isNaN("foo")); // true
console.log(Number.isNaN("foo")); // false

// Number.isFiniteが追加されている
console.log(isFinite(10)); // true
console.log(isFinite('10')); // true
console.log(Number.isFinite(10)); // true
console.log(Number.isFinite('10')); // false

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (5)

///*********************************************
//[既存クラスの拡張]
// String
//  便利なメソッド追加
//*********************************************

// 先頭の文字列を調べるstartsWith
console.log("abcde".startsWith("ab")); // true

// 末尾の文字列を調べるendsWith
console.log("abcde".endsWith("de")); // true

// 任意の場所に含まれる文字列を調べるinclude
console.log("abcde".includes("bcd")); // true

// 文字列を繰り返し連携するrepeat
console.log("abc".repeat(3)); // "abcabcabc"

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (4)


//*********************************************
// クラスの定義 (1)
//*********************************************

// Edgeでは動きました
// IE11、Chome47.0.2526.106 m、Firefox43.0.3ではエラーになります
//
// 商品クラス
class Product {

// コンストラクタ
constructor(code, name, price) {
// プロパティ
this.code = code;
this.name = name;
this.price = price;
}

// 商品コードをするメソッド
getCode() {
return this.code;
}

// 商品名を取得するメソッド
getName() {
return this.name;
}

// 商品定価の値を取得するメソッド
getPrice() {
if ( this.price < 0 ) {
this.price = 0;
}
return this.price;
}

// スタティックメソッド
static test(message) {
return "メッセージは「" + message + "」です";
}
}

var p1 = new Product("0001","日経ソフトウェア",980);
var p2 = new Product("0002","日経SYSTEMS",1300);
var p3 = new Product("0003","日経NETWORK",-1200);

console.log(" code = " + p1.getCode()); // code = 0001
console.log(" name = " + p1.getName()); // name = 日経ソフトウェア
console.log(" price = " + p1.getPrice()); // price = 980

console.log(" code = " + p2.getCode()); // code = 0002
console.log(" name = " + p2.getName()); // name = 日経SYSTEMS
console.log(" price = " + p2.getPrice()); // price = 1300

console.log(" code = " + p3.getCode()); // code = 0003
console.log(" name = " + p3.getName()); // name = 日経NETWORK
console.log(" price = " + p3.getPrice()); // price = 0

console.log(Product.test("テスト")); // メッセージは「テスト」です

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (3)

//*********************************************
// 関数の可変長引数(Rest Parameters)
//*********************************************

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました
//
// レストパラメータ

function foo(first, second, ...rest) {
console.log("first:", first);
console.log("second:", second);
console.log("rest:", rest);
}


foo(1, 2, 3, 4, 5);
// first: 1
// second: 2
// rest: [3, 4, 5]

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (2)

//*********************************************
// 関数の引数のデフォルトパラメータ
//(Default Parameters)
//*********************************************

// Firefox43.0.3だけで動きました
// IE11、Edge、Chome47.0.2526.106 mではエラーになります
//
// デフォルトパラメータ

function add(a = 1, b = 2) {
return a + b;
}

console.log(add()); // 3
console.log(add(0)); // 2
console.log(add(3,4)); // 7

ECMAScript 2015(ECMAScript 6)をちょっとずつ勉強 (1)

//*********************************************
// アロー関数(Arrow Functions)
// C#やJavaで言うところの ラムダ式のような記法
//*********************************************

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました
// なお、先頭がconst/varじゃなくてletの場合はEdge以外はエラーになります
//
// アロー関数でfunctionを省く

const plus1 = (x, y) => {
return x + y;
};

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました
// なお、先頭がconst/varじゃなくてletの場合はEdge以外はエラーになります
//
// 単一式の場合はブラケットやreturnを省略できる
const plus2 = (x, y) => x + y;

// IE11ではエラーになります
// Edge、Chome47.0.2526.106 m、Firefox43.0.3で動きました
// なお、先頭がconst/varじゃなくてletの場合はEdge以外はエラーになります
//
// 引数の丸括弧を省略
const square = n => n * n;

console.log(plus1(1,2)); // 3
console.log(plus2(1,2)); // 3
console.log(square(3)); // 9