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