ファイルの所有者を変更してみる

タイトルの通りです。管理者権限で実行しないとうまく動作しません。ちょっと改造してレジストリキーの所有者の変更もできると思います。

タイトルの通りです。管理者権限で実行しないとうまく動作しません。ちょっと改造してレジストリキーの所有者の変更もできると思います。

  • タグ:
  • タグはありません
// ファイルの所有者を変更してみる by ake260

// ※管理者権限で実行してください

#uselib "advapi32.dll"
#func OpenProcessToken "OpenProcessToken" int, int, var
#func LookupPrivilegeValue "LookupPrivilegeValueA" int, sptr, var
#func AdjustTokenPrivileges "AdjustTokenPrivileges" int, int, var, int, int, int
#func LookupAccountName "LookupAccountNameA" sptr, str, sptr, var, str, var, var
#cfunc SetNamedSecurityInfo "SetNamedSecurityInfoA" str, int, int, sptr, sptr, sptr, sptr

#uselib "kernel32.dll"
#cfunc GetCurrentProcess "GetCurrentProcess"
#func Closehandle "CloseHandle" int
#func FormatMessage "FormatMessageA" int, int, int, int, var, int, int

#define FALSE	0
#define NULL	0
#define ERROR_SUCCESS	$00000000

#define TOKEN_ADJUST_PRIVILEGES	$00000020
#define SE_PRIVILEGE_ENABLED	$00000002

#define SE_FILE_OBJECT 1
#define OWNER_SECURITY_INFORMATION	$00000001

#define FORMAT_MESSAGE_FROM_SYSTEM	$00001000
#define FORMAT_MESSAGE_IGNORE_INSERTS	$00000200

sdim DomainName, 256
DomainNameSize = 256

// 新しい所有者のユーザー名 (要管理者権限のユーザー)
AccountName = "Administrators"

// テスト用のファイルを指定 (作成しておいてください)
file = "test_owner.txt"

// プロセスに特権を付加 (一応) (いらないかも)
OpenProcessToken GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken
LookupPrivilegeValue 0, "SeTakeOwnershipPrivilege", Luid
tp = 1, Luid, 0, SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges hToken, FALSE, tp, 0, NULL, NULL
CloseHandle hToken

// 指定されたユーザーのSIDのサイズを取得
LookupAccountName 0, AccountName, NULL, SidSize, DomainName, DomainNameSize, snu

// バッファの確保 本来はLocalAllocを使うようだが、sdimでもいいようだ
sdim Sid, SidSize

// 指定されたユーザーのSIDを取得
LookupAccountName 0, AccountName, varptr(Sid), SidSize, DomainName, DomainNameSize, snu

// 所有者を設定
ret = SetNamedSecurityInfo(file, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, varptr(Sid), NULL, NULL, NULL)
if (ret == ERROR_SUCCESS) {
	mes "所有者の設定が完了しました。"
} else {
	mes "所有者の設定に失敗しました。"
	
	// エラーメッセージを表示 (一応)
	sdim ErrorBuf, 260
	FormatMessage FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ret, 0, ErrorBuf, 260, NULL
	mes ErrorBuf
}

stop