タイトルの通りです。管理者権限で実行しないとうまく動作しません。ちょっと改造してレジストリキーの所有者の変更もできると思います。
タイトルの通りです。管理者権限で実行しないとうまく動作しません。ちょっと改造してレジストリキーの所有者の変更もできると思います。
// ファイルの所有者を変更してみる 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