2014年9月30日 星期二

windows command mode 變更檔案目錄權限

舊的系統跟新的系統指令上的差異

XP 使用 cacls.exe

顯示或修改檔案的存取控制清單 (ACL)

CACLS filename [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C] [/G user:perm]
[/R user [...]] [/P user:perm [...]] [/D user [...]]

filename 顯示 ACL。

/T 變更目前目錄與所有子目錄中指定檔案的 ACL。

/L 處理符號連結本身而不是目標

/M 變更掛接到目錄的磁碟區 ACL

/S 顯示 DACL 的 SDDL 字串。

/S:SDDL 以 SDDL 字串中指定的項目取代 ACL
(不能搭配 /E、/G、/R、/P 或 /D 使用)。

/E 編輯 ACL 而不是取代 ACL。

/C 發生拒絕存取錯誤時仍繼續。

/G user:perm 授與指定使用者存取權限。
Perm 可以是 : R 讀取
W 寫入
C 變更 (寫入)
F 完全控制

/R user 撤銷指定使用者的存取權限 (必須與 /E 一起使用)。

/P user:perm 取代指定使用者的存取權限。
Perm 可以是 : N 無
R 讀取
W 寫入
C 變更 (寫入)
F 完全控制

/D user 拒絕指定使用者存取。

可以在命令中使用萬用字元指定一個以上的檔案。
您可以在命令中指定一個以上的使用者。

縮寫:
CI - 容器繼承。
目錄將繼承 ACE。

OI - 物件繼承。
檔案將繼承 ACE。

IO - 僅繼承。
ACE 不會套用到目前的檔案/目錄。

ID - 已繼承。
從父目錄的 ACL 繼承 ACE。


Vista 之後使用 icacls.exe
ICACLS name /save aclfile [/T] [/C] [/L] [/Q]
 將符合名稱之檔案與資料夾的 DACL 儲存至 aclfile,以供稍後與
 /restore 搭配使用。請注意,這不會儲存 SACL、擁有者或完整
 性標籤。

ICACLS directory [/substitute SidOld SidNew [...]] /restore aclfile
[/C] [/L] [/Q]
將儲存的 DACL 套用到目錄中的檔案。

ICACLS name /setowner user [/T] [/C] [/L] [/Q]
變更所有相符名稱的擁有者。此選項不會強制變更擁有權; 如果要強制變更擁有
權,請使用 takeown.exe 公用程式。

ICACLS name /findsid Sid [/T] [/C] [/L] [/Q]
尋找內含明確提及 Sid 之 ACL 的所有相符名稱。

ICACLS name /verify [/T] [/C] [/L] [/Q]
尋找含有未使用標準格式的 ACL 或長度與 ACE 計數不一致的所有檔案。

ICACLS name /reset [/T] [/C] [/L] [/Q]
針對所有符合的檔案,使用預設繼承的 ACL 取代 ACL。

ICACLS name [/grant[:r] Sid:perm[...]]
[/deny Sid:perm [...]]
[/remove[:g|:d]] Sid[...]] [/T] [/C] [/L] [/Q]
[/setintegritylevel Level:policy[...]]

/grant[:r] Sid:perm 授與指定的使用者存取權限。若加上 :r,該權限便會取
代先前授與的明確權限。若不加上 :r,則會將權限加入先前授與的任何明
確權限。

/deny Sid:perm 明確拒絕指定的使用者存取權限。對指定的權限新增明確拒絕的
ACE,並將任何明確授與中的相同權限移除。

/remove[:[g|d]] Sid 會移除 ACL 中 Sid 的所有符合項目。若加上 :g,會將授
與該 Sid 之權限的所有符合項目移除。若加上 :d,則會將拒絕該 Sid 之權
限的所有符合項目移除。

/setintegritylevel [(CI)(OI)]Level 明確地新增完整性 ACE 至所有符合的檔
案。可指定下列層級的其中一個:
L[ow]
M[edium]
H[igh]
完整性 ACE 的繼承選項具有高於層級的優先性,且只會套用到目錄。

/inheritance:e|d|r
e - 啟用繼承
d - 停用繼承並複製 ACE
r - 移除所有繼承的 ACE

注意:
Sid 的格式可以是數字或好記的名稱。如果指定使用數字格式,請在 SID 的開頭
加上 *。

/T 指示要在 name 指定之目錄下的所有相符檔案/目錄上執行此操作。

/C 指示不論發生任何檔案錯誤,都繼續執行此操作。仍會顯示錯誤訊息。

/L 指示此操作會在符號連結 (而非其目標) 上執行。

/Q 指示 icacls 應隱藏成功訊息。

ICACLS 保留 ACE 項目的標準順序:
明確拒絕
明確授與
繼承拒絕
繼承授與

perm 是權限遮罩,可使用下列其中一種格式來指定:
一連串簡單權限:
N - 不允許存取
F - 完整存取權
M - 修改存取權
RX - 讀取和執行存取權
R - 唯讀存取權
W - 唯寫存取權
D - 刪除存取權
在括號中以逗號分隔特定權限的清單:
DE - 刪除
RC - 讀取控制
WDAC - 寫入 DAC
WO - 寫入擁有者
S - 同步
AS - 存取系統安全性
MA - 允許的最大值
GR - 一般讀取
GW - 一般寫入
GE - 一般執行
GA - 一般所有權限
RD - 讀取資料/列出目錄
WD - 寫入資料/新增檔案
AD - 附加資料/新增子目錄
REA - 讀取擴充屬性
WEA - 寫入擴充屬性
X - 執行/周遊
DC - 刪除子系
RA - 讀取屬性
WA - 寫入屬性
繼承權限的優先順序高於上述任一種格式,且僅套用到目錄:
(OI) - 物件繼承
(CI) - 容器繼承
(IO) - 僅繼承
(NP) - 不傳播繼承
(I) - 從父容器繼承的權限

範例:

icacls c:\windows\* /save AclFile /T
- 會將 c:\windows 及其子目錄下所有檔案的 ACL 儲存到 AclFile。

icacls c:\windows\ /restore AclFile
- 會還原 AclFile 之中每個檔案的 Acl,而 AclFile 位於 c:\windows 及其子目錄下。

icacls file /grant Administrator:(D,WDAC)
- 會將檔案的刪除和寫入 DAC 權限授與使用者 Administrator。

icacls file /grant *S-1-1-0:(D,WDAC)
- 會將檔案的刪除和寫入 DAC 權限授與 sid S-1-1-0 所定義的使用者。
只是不知道為什麼我使用 icacls 的時候不管設定 :F完整存取權, 還是其它的, 權限都會被清空, 只剩下特殊存取權限
後來經同事測試, 要用 :(OI)(CI)F 這樣才會有完整存取權

2014年9月25日 星期四

取得作業系統版本資訊

利用WINDOWS API 取得相關資訊
可以參考 GetVersionEx() function

得到的結構參考 OSVERSIONINFOEX

這次是為了取得是否是 Win7 以上的版本
相關的Code如下


bool  IsWindows7OrGreater()
{
    OSVERSIONINFO info;
    GetVersionEx(&info);

    return info.dwMajorVersion>=6;
}



2014年9月23日 星期二

Android 4.2.2 開啟 開發人員選項 的方法

  1. 首先先到 [設定]  ->  [關於手機]  ->  [版本號碼] 的地方
  2. 在 [版本號碼] 的地方連點7-10下
  3. 在 [設定] -> [系統] 的地方就會出現 [開發人員選項]

2014年9月18日 星期四

InstallShield 2012 Sprint 使用筆記

Custom Actions:
  1. 新增Kill Process的時候, 並沒有地方設定要kill的process name,這時候就要到 Behavior and Logic ->  Property Manager 去新增一筆 ISTerminateProcesses,  Value 設為要kill 的程式名, 多筆的時候用分號隔開,  exp: a.exe;b.exe  參考網址
  2. 如果要在移除的時候執行指定的動作我目前的 Sequence 設定是將 Install Exec Sequence 設成 After SetARPINSTALLLOCATION,  Condition 設為 REMOVE="ALL"



2014年5月22日 星期四

2014年4月14日 星期一

Services程式與一般程式之間共享資訊

主要是透過Share Memory的方式建立可以共同存取的記憶體
這樣A可以寫入資訊讓B去讀取, 彼此溝通

Process A:

HANDLE hFile;
char writeBuffer[128]={0};
LPCTSTR pBuf;          
char szFileName[]="Global\\Test";
SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
         "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)",
         SDDL_REVISION_1, &security.lpSecurityDescriptor,NULL);

hFile = CreateFileMapping((HANDLE)0xFFFFFFFF,&security,PAGE_READWRITE,0,sizeof(writeBuffer),szFileName  );

pBuf = (LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
strcat((char*)pBuf,"This is a Share Memory!!");
CloseHandle(hFile);


Process B:

char szFileName[]="Global\\Test";
Char writeBuffer[128]={0};
LPCTSTR pBuf;
HANDLE hFile;
hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szFileName);
pBuf=(LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
if(strlen(pBuf))
    Edit1->Text = pBuf;
CloseHandle(hFile);



特別要注意的是紅色部分是 Service 要加入的部分, 透過這樣設定DACL授予普通用戶讀取權限的記憶體共享, 如果需要寫入的話, 要將 GR改成GWGR, 只是, 請注意, 這樣是不安全的!!

參考網頁:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
http://stackoverflow.com/questions/898683/how-to-share-memory-between-services-and-user-processes
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376401(v=vs.85).aspx

2014年2月17日 星期一

BCB6 Warring W8058 Cannot create pre-compiled header: write failed

出現這個問題的時候是因為
Option-》Compiler-》Pre-compiled Headers 下面的FileName 設定路徑不存在